第一篇:java就業(yè)基地
java就業(yè)基地
Java是一種簡單的,面向?qū)ο蟮?,分布式的,說明型的,健壯安全的,結(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線程的動(dòng)態(tài)語言。Java分為三個(gè)體系JavaSE
(Java2 Platform Standard Edition,java平臺標(biāo)準(zhǔn)版),JavaEE(Java 2 Platform,Enterprise Edition,java平臺企業(yè)版),JavaME(Java 2 Platform Micro Edition,java平臺微型版)。所以一般JAVA培訓(xùn)也分為J2SE,J2EE,J2ME培訓(xùn),各個(gè)體系的方向有所不同,JAVA培訓(xùn)的內(nèi)容也有所不同。
通過JAVA就業(yè)培訓(xùn),學(xué)員可以系統(tǒng)把握面向?qū)ο缶幊陶Z言JAVA的核心語法,能夠理解J2SE、J2ME、J2EE三種體系架構(gòu)的理論思想和架構(gòu)內(nèi)容,把握J(rèn)AVA程序設(shè)計(jì)的主要模式和核心思想,熟練把握基于JAVA語言的編程技巧和編程工具,能夠獨(dú)立完成基于JAVA的客戶端和服務(wù)器端應(yīng)用程序的開發(fā)、調(diào)試、部署和執(zhí)行。一般JAVA培訓(xùn)包括以下內(nèi)容:HTML/XML語言。數(shù)據(jù)庫技術(shù)。Java程序設(shè)計(jì)。數(shù)據(jù)結(jié)構(gòu)與算法。Java設(shè)計(jì)模式。J2EE設(shè)計(jì)和應(yīng)用。Eclipse/CVS/OpenSource.軟件測試/安全性編碼技術(shù)。UML設(shè)計(jì)。UNIX.項(xiàng)目實(shí)戰(zhàn)。
JAVA就業(yè)前景
JAVA人才社會需求量大,根據(jù)IDC的統(tǒng)計(jì)數(shù)字,在所有軟件開發(fā)類人才的需求中,對JAVA工程師的需求達(dá)倒全部需求量的60%~70%。同時(shí),JAVA工程師的薪水相對較高。通常來說,具有3~5年開發(fā)經(jīng)驗(yàn)的工程師,擁有年薪10萬元是很正常的一個(gè)薪酬水平。80%學(xué)員畢業(yè)后年薪都超過了5萬元。Java平臺以其移動(dòng)性、安全性和開放性受倒追捧。
JAVA就業(yè)前景分析:Java發(fā)展方向大致分為兩類:
成為管理人員,例如產(chǎn)品研發(fā)經(jīng)理,技術(shù)經(jīng)理,項(xiàng)目經(jīng)理等繼續(xù)他的技術(shù)工作之路,成為高級軟件工程師、需求工程師等。根據(jù)IDC的統(tǒng)計(jì)數(shù)字,在所有軟件開發(fā)類人才的需求中,對Java工程師的需求達(dá)到全部需求量的60%~70%。同時(shí),Java工程師的薪水相對較高。Java軟件工程師一般月薪范圍在4000-10000元,遠(yuǎn)遠(yuǎn)超過了應(yīng)屆畢業(yè)生月薪2500元的平均水平。通常來說,有一年工作經(jīng)驗(yàn)的Java高級軟件工程師的薪酬大致在年薪10—13萬左右。
從Java的應(yīng)用領(lǐng)域來分,Java語言的應(yīng)用方向主要表現(xiàn)在以下三個(gè)方面:首先是大中型的商業(yè)應(yīng)用;其次是桌面應(yīng)用,就是常說的C/S應(yīng)用;再次是移動(dòng)領(lǐng)域應(yīng)用。綜上而言JAVA就業(yè)方向?yàn)椋嚎梢詮氖翵SP網(wǎng)站開發(fā)、Java編程、Java游戲開發(fā)、Java桌面程序設(shè)計(jì),以及其他與Java語言編程相關(guān)的工作??蛇M(jìn)入電信、銀行、保險(xiǎn)專業(yè)軟件開發(fā)公司等從事軟件設(shè)計(jì)和開發(fā)工作。
第二篇:就業(yè)基地材料
革新培訓(xùn)理念,突出專業(yè)特色
——江西師范大學(xué)文學(xué)院優(yōu)質(zhì)就業(yè)基地申報(bào)材料
從1999年高校擴(kuò)招以來,高等教育迅速從精英化教育階段向大眾化教育階段轉(zhuǎn)變。隨著高等教育的大眾化、社會用人機(jī)制的市場化等因素,大學(xué)生供求關(guān)系發(fā)生了根本變化。大學(xué)生就業(yè)由計(jì)劃經(jīng)濟(jì)的“統(tǒng)包統(tǒng)分”政策轉(zhuǎn)變?yōu)槭袌鼋?jīng)濟(jì)的“市場導(dǎo)向、政府調(diào)控、學(xué)校推薦、雙向選擇”政策。就業(yè)政策的調(diào)整與變化促使高校與畢業(yè)生主動(dòng)去尋找就業(yè)市場,高校與用人單位雙方達(dá)成契約后建立的就業(yè)基地?zé)o疑為畢業(yè)生擇業(yè)、就業(yè)提供了一條便利通道。
江西師范大學(xué)文學(xué)院的秉著服務(wù)學(xué)生的宗旨,與樟樹中學(xué)簽訂了《江西師范大學(xué)畢業(yè)生就業(yè)基地建設(shè)協(xié)議書》,在結(jié)合用人單位崗位需求的前提下為廣大畢業(yè)生提供更多的實(shí)訓(xùn)和工作崗位,為畢業(yè)生提供實(shí)訓(xùn)的同時(shí)幫助畢業(yè)生順利就業(yè)。
一、基地介紹
我院于2017年與樟樹中學(xué)簽訂就業(yè)基地協(xié)議書。樟樹中學(xué)1978年便被列為江西省首批19所重點(diǎn)中學(xué)之一,其后更是砥礪前行,取得了驕人的辦學(xué)成績。2016年被評為江西基礎(chǔ)教育質(zhì)量十佳示范學(xué)校,它始終堅(jiān)持“構(gòu)建適合學(xué)生發(fā)展的教育”的辦學(xué)理念,緊緊圍繞“立足優(yōu)質(zhì)、發(fā)掘特長、多樣發(fā)展、形成特色”的辦學(xué)思路,努力實(shí)現(xiàn)“學(xué)生成人、教師成名、學(xué)校發(fā)展、人民滿意”的辦學(xué)目標(biāo)。
圖1 學(xué)校大門
圖2 學(xué)校雕塑
(一)師資、辦學(xué)等軟硬件條件
截止2017年,樟樹中學(xué)共有教師313人,其中研究生學(xué)歷教師39人,高級教師142人,中級教師111人,全國教育系統(tǒng)勞模2人,全國優(yōu)秀教育工作者3人,全國優(yōu)秀教師4人,省學(xué)科帶頭人、骨干教師30余人。為確保優(yōu)質(zhì)高效的教學(xué)質(zhì)量,該校扎實(shí)推進(jìn)“五課”制度,即骨干教師上示范課,年輕教師上匯報(bào)課,青年教師上優(yōu)質(zhì)課,專任教師上公開課,領(lǐng)導(dǎo)聽推門課。同時(shí)檢查教案、評比月考周練試卷、備課組評優(yōu)等教學(xué)常規(guī),力圖創(chuàng)設(shè)靜心教書的氛圍。
此外,為全面提升學(xué)生素質(zhì),豐富學(xué)生課外活動(dòng),樟樹中學(xué)成立了科技社、合唱團(tuán)、羽毛球社、文學(xué)社、書法社、手工社等數(shù)十個(gè)社團(tuán),并實(shí)行社長負(fù)責(zé)制,由社長聘請學(xué)有專長的中青年教師擔(dān)任輔導(dǎo)老師。在活躍的社團(tuán)氛圍下,師生間進(jìn)行良性互動(dòng),既幫助學(xué)生提高實(shí)踐創(chuàng)新能力,又不斷更新教師的教學(xué)方式,實(shí)現(xiàn)教學(xué)相長。
(二)對畢業(yè)生教育技能、素質(zhì)等要求
樟樹中學(xué)良好的辦學(xué)理念、優(yōu)質(zhì)的教學(xué)質(zhì)量,無疑對新任教師提出了更高的要求。在基地建設(shè)所達(dá)成的協(xié)議中,樟樹中學(xué)對我院畢業(yè)生提出了基本要求:
其一,培養(yǎng)學(xué)生扎實(shí)的專業(yè)基礎(chǔ)和較強(qiáng)的實(shí)踐能力。為達(dá)成此目標(biāo),我院除緊抓學(xué)生的專業(yè)知識訓(xùn)練,還特別要加強(qiáng)實(shí)踐環(huán)節(jié)的教育管理力,強(qiáng)化實(shí)際操作能力,真正意義上培育業(yè)務(wù)熟練的專門人才。
其二,根據(jù)經(jīng)濟(jì)社會發(fā)展和樟樹中學(xué)提出的需求,我院需及時(shí)調(diào)整專業(yè)設(shè)置,培養(yǎng)“適銷對路”的人才。
其三,加強(qiáng)學(xué)生的德育綜合素質(zhì)教育,培育健康人格。我院嚴(yán)格遵守協(xié)議要求,優(yōu)質(zhì)生源可優(yōu)先安排去樟樹中學(xué)實(shí)習(xí),在實(shí)際演練中提升自我的教育技能。同時(shí),樟樹中學(xué)也派人來我院開設(shè)相關(guān)講座,為畢業(yè)生提供必要的就業(yè)指導(dǎo),雙方在交流中加深彼此的了解。
(三)往年接收生源情況
據(jù)有關(guān)數(shù)據(jù)顯示,近三年來樟樹中學(xué)共接收我院畢業(yè)生23人,其中2015年9人,2016年5人,2017年9人。以2016年入職樟樹中學(xué)語文教師的陳某為例,一年來的打磨已經(jīng)基本適應(yīng)了那里的教書工作,生活節(jié)奏也是井井有條。雖也經(jīng)歷了初生牛犢的緊張期,但憑著虛心學(xué)習(xí)的態(tài)度以及穩(wěn)固的抗壓能力,逐步地進(jìn)入了正常軌道。陳某的例子隨處可見,這是每一個(gè)入職新手都要經(jīng)歷的過程。隨著文學(xué)院――樟樹中學(xué)就業(yè)基地的建設(shè),提前的職場培訓(xùn)也可適當(dāng)緩解畢業(yè)生入職初期的壓力,雙方合作也將有利于畢業(yè)生的就業(yè)去向選擇。
二、合作特色
(一)準(zhǔn)確定位,合理布局
就業(yè)基地建設(shè)定位準(zhǔn)確、布局合理,與學(xué)院專業(yè)優(yōu)勢、學(xué)歷層次有機(jī)結(jié)合。樟樹中學(xué)60年代以來便列為江西省重點(diǎn)中學(xué),1994年通過首批省重點(diǎn)中學(xué)評估驗(yàn)收,被省教委授予“省優(yōu)秀重點(diǎn)中學(xué)”稱號,近年來累計(jì)為清華、北大等名牌重點(diǎn)大學(xué)輸送學(xué)生4700余名,大學(xué)本科11000余名,教學(xué)成果顯著?;谠撔夂竦娜宋姆諊c優(yōu)秀的教學(xué)業(yè)績,我院于建立樟樹中學(xué)就業(yè)基地之初便做好“正確引導(dǎo)、優(yōu)化專業(yè)、科學(xué)管理、提高水平”的定位,引導(dǎo)學(xué)生正確認(rèn)識建立就業(yè)基地對其個(gè)人成長的作用,加強(qiáng)學(xué)生教學(xué)技能培養(yǎng),對進(jìn)入就業(yè)基地的本院學(xué)生及樟樹中學(xué)教師實(shí)行科學(xué)管理,提高學(xué)生教學(xué)水平,與就業(yè)基地相互促進(jìn)、相互成長。
(二)搭建平臺,促進(jìn)就業(yè)
就業(yè)基地建設(shè)牢牢把住就業(yè)與實(shí)訓(xùn)兩個(gè)大關(guān),通過搭建就業(yè)平臺動(dòng)員畢業(yè)生參與實(shí)訓(xùn)。樟樹中學(xué)作為我院實(shí)習(xí)就業(yè)基地之一,自簽訂就業(yè)基地協(xié)議之日起,便將建立就業(yè)見習(xí)基地與教學(xué)實(shí)訓(xùn)基地作為雙方共同構(gòu)建的一項(xiàng)系統(tǒng)工程,將學(xué)生的實(shí)習(xí)、實(shí)訓(xùn)有機(jī)結(jié)合起來,也是實(shí)現(xiàn)課堂教學(xué)與社會職業(yè)崗位聯(lián)系的橋梁。過去三年樟樹中學(xué)接收我院大學(xué)四年級教育實(shí)習(xí)學(xué)生共計(jì)124名,提供了為數(shù)眾多的教育實(shí)習(xí)崗位,不但使應(yīng)屆畢業(yè)生的實(shí)際教學(xué)能力得到鍛煉、減輕學(xué)院聯(lián)系實(shí)習(xí)學(xué)校的壓力,也為大學(xué)生畢業(yè)后就業(yè)創(chuàng)造了條件。
(三)加強(qiáng)指導(dǎo),轉(zhuǎn)變觀念
就業(yè)基地通過開設(shè)就業(yè)指導(dǎo)課程,加深學(xué)生對不同職業(yè)的了解從而轉(zhuǎn)變就業(yè)觀念。按年級來說,就業(yè)基地對低年級學(xué)生的培養(yǎng)重點(diǎn)放在職業(yè)生涯規(guī)劃與發(fā)展上,同時(shí)關(guān)注高年級學(xué)生面試技巧和職前教育培養(yǎng)兩個(gè)方面。對一年級大學(xué)生進(jìn)行合理的職業(yè)生涯規(guī)劃的引導(dǎo),加強(qiáng)就業(yè)方面相關(guān)原則、形勢、知識的了解與學(xué)習(xí),積極配合學(xué)?!堵殬I(yè)生涯規(guī)劃》課程的開展,使學(xué)生了解不同專業(yè)與不同職業(yè)之間的關(guān)系及相關(guān)職業(yè)對求職者的具體要求;二年級主要是職業(yè)定位,努力建立扎實(shí)的基礎(chǔ)知識和合理的知識結(jié)構(gòu),為求職打下基礎(chǔ);
三、四年級要進(jìn)行職業(yè)測評,根據(jù)自己個(gè)性特點(diǎn)、專業(yè)特長,努力拓寬知識面,提高能力,并進(jìn)行就業(yè)政策、民辦學(xué)校管理、現(xiàn)代企業(yè)理念、法律、人際關(guān)系與公共禮儀、求職面試技巧等方面準(zhǔn)備。如我院卓越班曾多次組織學(xué)生赴樟樹中學(xué)進(jìn)行實(shí)地教學(xué)調(diào)研,使學(xué)生深入了解教學(xué)實(shí)際,為個(gè)人就業(yè)觀念、就業(yè)定位的建立打下基礎(chǔ)。同時(shí)成立就業(yè)指導(dǎo)教研室,由劉德旭同志擔(dān)任教研室組長,加強(qiáng)就業(yè)指導(dǎo)科學(xué)研究,不斷提高就業(yè)指導(dǎo)水平。
(四)深化改革,提升素質(zhì)
就業(yè)基地建設(shè)與深化教育教學(xué)改革、提高教育質(zhì)量與學(xué)生綜合素質(zhì)相結(jié)合。以樟樹中學(xué)為基點(diǎn),根據(jù)不斷變化的人才市場需求情況,不斷深化教學(xué)改革,提高畢業(yè)生的社會適應(yīng)性和就業(yè)競爭力。將就業(yè)基地的情況,特別是用人單位需求什么樣的人才等信息及時(shí)反饋到學(xué)校,進(jìn)一步推進(jìn)學(xué)校教育教學(xué)改革,逐步走向“訂單式”培養(yǎng),為學(xué)??沙掷m(xù)發(fā)展服務(wù)。
(五)開拓市場,改善服務(wù)
就業(yè)基地努力提高畢業(yè)生就業(yè)服務(wù)制度化、專業(yè)化、全程化水平,體現(xiàn)以學(xué)生為本的思想,建立全方位的就業(yè)服務(wù)體系,實(shí)行多方聯(lián)動(dòng)。就業(yè)基地通過強(qiáng)化畢業(yè)生就業(yè)指導(dǎo)服務(wù)機(jī)構(gòu)的公共服務(wù)職能,充分發(fā)揮其公益性和主渠道作用,讓畢業(yè)生盡可能更多地掌握用人單位的需求信息,避免盲目性。加強(qiáng)就業(yè)跟蹤服務(wù)工作,解決學(xué)生就業(yè)難題,同時(shí)根據(jù)學(xué)生反饋的就業(yè)信息,不斷改進(jìn)工作,擴(kuò)大就業(yè)市場,真正使高校畢業(yè)生就業(yè)走上“招生――培養(yǎng)――就業(yè)”通暢的良性循環(huán)之路。
圖三 我院與樟樹中學(xué)所簽訂的就業(yè)基地建設(shè)協(xié)議書
三、成效反饋
樟樹中學(xué)就業(yè)基地建立三年來成果頗豐、效果顯著,真正實(shí)現(xiàn)雙方的共同促進(jìn)、共同成長與合作共贏。
(一)于文學(xué)院而言
首先,樟樹中學(xué)就業(yè)基地的建立有利于我院教學(xué)課程設(shè)置的合理安排,使教學(xué)規(guī)劃更加切合市場要求,學(xué)生綜合素質(zhì)與就業(yè)實(shí)際相適應(yīng)。依據(jù)樟樹中學(xué)所反饋的實(shí)習(xí)情況與人才需求情況等信息,我院對本科培養(yǎng)方案做出一定程度的調(diào)整,并以卓越班為試驗(yàn)田進(jìn)行教學(xué)實(shí)驗(yàn),卓越班同學(xué)教學(xué)能力、教學(xué)理念、教學(xué)技巧、公共禮儀、師姿師風(fēng)等比之普通同學(xué)均有顯著提升,為我院后期全面教學(xué)教育改革打下基礎(chǔ)。
其次,樟樹中學(xué)就業(yè)基地為我院學(xué)生提供了良好的就業(yè)培訓(xùn)平臺。該校教師資歷深、能力強(qiáng),我院學(xué)生在教育實(shí)習(xí)過程中均在不同程度上有所收獲,得到全方位的培訓(xùn)與鍛煉,為學(xué)生的教育技能的提高提供平臺與空間,為學(xué)生就業(yè)增加更多保障。
最后,樟樹中學(xué)就業(yè)基地為我院學(xué)生提供了可靠的就業(yè)單位,為我院就業(yè)率的提高做出了貢獻(xiàn)。2015—2017年以來,樟樹中學(xué)共接收我院應(yīng)屆畢業(yè)生23名,投入大量時(shí)間、精力、金錢培養(yǎng)新生教師,使其逐步向骨干教師、優(yōu)秀教師邁進(jìn),為學(xué)生的終身發(fā)展提供良好平臺。
(二)于樟樹中學(xué)而言
一方面,樟樹中學(xué)就業(yè)基地建立以來,我院與該校形成了良好的雙方合作與交流,為該校教師提供了大量繼續(xù)教育、進(jìn)修的機(jī)會,如我院每年假期開展的“國培計(jì)劃”始終堅(jiān)持為樟樹中學(xué)提供進(jìn)修名額,使該校教師能夠繼續(xù)教育、持續(xù)充電,一定程度上為該校語文教學(xué)水平的提高做出貢獻(xiàn)。
另一方面,三年來我院共為該校提供23名漢語言文學(xué)師范類應(yīng)屆畢業(yè)生,一定程度上彌補(bǔ)了該校語文教師短缺的不足,使得該校的語文教學(xué)活動(dòng)能夠正常開展。同時(shí),新鮮血液的加入也為該校語文教研組注入新的活力,使語文教學(xué)能夠更貼近學(xué)生實(shí)際,縮短師生之間由于年齡差距過大帶來的認(rèn)知差異。
四、發(fā)展前景
從宏觀上來考慮,就業(yè)基地的建設(shè)是高等教育適應(yīng)社會經(jīng)濟(jì)發(fā)展而培養(yǎng)市場需要的人才的有力見證。對于經(jīng)濟(jì)相對欠發(fā)達(dá)的中部省份來說,更需要及時(shí)掌握社會對人才的發(fā)展要求,以此作出相應(yīng)的教育教學(xué)改革,緊跟上社會、經(jīng)濟(jì)發(fā)展前沿的步伐。
我院與樟樹中學(xué)等建設(shè)就業(yè)基地的舉動(dòng),在我院領(lǐng)導(dǎo)積極帶動(dòng)、學(xué)生主動(dòng)配合的條件下,已經(jīng)取得顯著的成效。就業(yè)基地為我院本科生提供了與專業(yè)、能力相匹配的就業(yè)實(shí)習(xí)機(jī)會,在兼顧用人單位和大學(xué)生根本利益的基礎(chǔ)上,一方面緩解大學(xué)生就業(yè)壓力,幫助他們積累工作經(jīng)驗(yàn),形成幫助、關(guān)心大學(xué)生就業(yè)的濃厚氛圍;另一方面,就業(yè)基地為用人單位搭建了一個(gè)選人用人平臺,一定程度上緩解部分事業(yè)單位用人緊張的狀態(tài)。就目前來看,我院已與樟樹中學(xué)、萬載縣第二中學(xué)建立了良好的就業(yè)合作關(guān)系,在未來也必將吸引越來越多優(yōu)質(zhì)單位向我院伸出橄欖枝。
第三篇:Java就業(yè)面試題
1、一個(gè)“.java”源文件中是否可以包括多個(gè)類(不是內(nèi)部類)?有什么限制? 可以有多個(gè)類,但只能有一個(gè)public的類,并且public的類名必須與文件名相一致。
3、說說&和&&的區(qū)別。
&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。
&&還具有短路的功能,即如果
6、short s1 = 1;s1 = s1 + 1;有什么錯(cuò)? short s1 = 1;s1 += 1;有什么錯(cuò)? 對于short s1 = 1;s1 = s1 + 1;由于s1+1運(yùn)算時(shí)會自動(dòng)提升表達(dá)式的類型,所以結(jié)果是int型,再賦值給short類型s1時(shí),編譯器將報(bào)告需要強(qiáng)制轉(zhuǎn)換類型的錯(cuò)誤。
對于short s1 = 1;s1 += 1;由于 += 是java語言規(guī)定的運(yùn)算符,java編譯器會對它進(jìn)行特殊處理,因此可以正確編譯。
7、char型變量中能不能存貯一個(gè)中文漢字?為什么? char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,所以,char型變量中當(dāng)然可以存儲漢字啦。不過,如果某個(gè)特殊的漢字沒有被包含在unicode編碼字符集中,那么,這個(gè)char型變量中就不能存儲這個(gè)特殊漢字。補(bǔ)充說明:unicode編碼占用兩個(gè)字節(jié),所以,char類型的變量也是占用兩個(gè)字節(jié)。
備注:后面一部分回答雖然不是在正面回答題目,但是,為了展現(xiàn)自己的學(xué)識和表現(xiàn)自己對問題理解的透徹深入,可以回答一些相關(guān)的知識,做到知無不言,言無不盡。
8、用最有效率的方法算出2乘以8等於幾? 2 << 3,將一個(gè)數(shù)左移n位,就相當(dāng)于乘以了2的n次方,那么,一個(gè)數(shù)乘以8只要將其左移3位即可,而位運(yùn)算cpu直接支持的,效率最高,所以,2乘以8等於幾的最效率的方法是2 << 3。
10、使用final關(guān)鍵字修飾一個(gè)變量時(shí),是引用變量不能變,還是引用的對象不能變?
使用final關(guān)鍵字修飾一個(gè)變量時(shí),是指引用變量不能變,引用變量所指向的對象中的內(nèi)容還是可以改變的。例如,對于如下語句: final StringBuffer a=new StringBuffer(“immutable”);執(zhí)行如下語句將報(bào)告編譯期錯(cuò)誤: a=new StringBuffer(“");但是,執(zhí)行如下語句則可以通過編譯: a.append(” broken!“);
有人在定義方法的參數(shù)時(shí),可能想采用如下形式來阻止方法內(nèi)部修改傳進(jìn)來的參數(shù)對象:
public void method(final StringBuffer param){
} 實(shí)際上,這是辦不到的,在該方法內(nèi)部仍然可以增加如下代碼來修改參數(shù)對象:
param.append(”a“);
11、”==“和equals方法究竟有什么區(qū)別?
==操作符專門用來比較兩個(gè)變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是否相同,要比較兩個(gè)基本類型的數(shù)據(jù)或兩個(gè)引用變量是否相等,只能用==操作符。
equals方法是用于比較兩個(gè)獨(dú)立對象的內(nèi)容是否相同,就好比去比較兩個(gè)人的長相是否相同,它比較的兩個(gè)對象是獨(dú)立的。例如,對于下面的代碼:
12、靜態(tài)變量和實(shí)例變量的區(qū)別?
在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實(shí)例變量前則不加。在程序運(yùn)行時(shí)的區(qū)別:實(shí)例變量屬于某個(gè)對象的屬性,必須創(chuàng)建了實(shí)例對象,其中的實(shí)例變量才會被分配空間,才能使用這個(gè)實(shí)例變量。靜態(tài)變量不屬于某個(gè)實(shí)例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實(shí)例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了??傊?,實(shí)例變量必須創(chuàng)建對象后才可以通過這個(gè)對象來使用,靜態(tài)變量則可以直接使用類名來引用。
13、是否可以從一個(gè)static方法內(nèi)部發(fā)出對非static方法的調(diào)用?
不可以。非static方法是要與對象關(guān)聯(lián)在一起的,必須創(chuàng)建一個(gè)對象后,才可以在該對象上進(jìn)行方法調(diào)用,而static方法調(diào)用時(shí)不需要?jiǎng)?chuàng)建對象,可以直接調(diào)用。一個(gè)static方法內(nèi)部發(fā)出對非static方法的調(diào)用。
14、Integer與int的區(qū)別
int是java提供的8種原始數(shù)據(jù)類型之一。Java為每個(gè)原始類型提供了封裝類,Integer是java為int提供的封裝類。int的默認(rèn)值為0,而Integer的默認(rèn)值為null,即Integer可以區(qū)分出未賦值和值為0的區(qū)別,int則無法表達(dá)出未賦值的情況,例如,要想表達(dá)出沒有參加考試和考試成績?yōu)?的區(qū)別,則只能使用Integer。在JSP開發(fā)中,Integer的默認(rèn)為null,所以用el表達(dá)式在文本框中顯示時(shí),值為空白字符串,而int默認(rèn)的默認(rèn)值為0,所以用el表達(dá)式在文本框中顯示時(shí),結(jié)果為0,所以,int不適合作為web層的表單數(shù)據(jù)的類型。
在Hibernate中,如果將OID定義為Integer類型,那么Hibernate就可以根據(jù)其值是否為null而判斷一個(gè)對象是否是臨時(shí)的,如果將OID定義為了int類型,還需要在hbm映射文件中設(shè)置其unsaved-value屬性為0。
另外,Integer提供了多個(gè)與整數(shù)相關(guān)的操作方法,例如,將一個(gè)字符串轉(zhuǎn)換
成整數(shù),Integer中還定義了表示整數(shù)的最大值和最小值的常量。
15、Math.round(11.5)等於多少? Math.round(-11.5)等於多少? Math類中提供了三個(gè)與取整有關(guān)的方法:ceil、floor、round,這些方法的作用與它們的英文名稱的含義相對應(yīng),例如,ceil的英文意義是天花板,該方法就表示向上取整,所以,Math.ceil(11.3)的結(jié)果為12,Math.ceil(-11.3)的結(jié)果是-11;floor的英文意義是地板,該方法就表示向下取整,所以,Math.floor(11.6)的結(jié)果為11,Math.floor(-11.6)的結(jié)果是-12;round方法,它表示“四舍五入”,算法為Math.floor(x+0.5),即將原來的數(shù)字加上0.5后再向下取整,所以,Math.round(11.5)的結(jié)果為12,Math.round(-11.5)的結(jié)果為-11。
15、下面的代碼有什么不妥之處? 1.if(username.equals(“zxx”){} 如果username=null;會報(bào)異常,而且少個(gè)括號結(jié)束。
2.int x = 1;return x==1?true:false;X==1返回的本來就是boolean類型 后面的true:false是多余的.16、請說出作用域public,private,protected,以及不寫時(shí)的區(qū)別 這四個(gè)作用域的可見范圍如下表所示。
說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。
作用域
當(dāng)前類 同一package 子孫類 其他package public
√
√
√
√ protected √
√
√
× friendly
√
√
×
× private
√
×
×
×
備注:只要記住了有4種訪問權(quán)限,4個(gè)訪問范圍,然后將全選和范圍在水平和垂直方向上分別按排從小到大或從大到小的順序排列,就很容易畫出上面的圖了。
17、Overload和Override的區(qū)別(觀察者和被觀察者模式)。Overloaded的方法是否可以改變返回值的類型? Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重載Overload表示同一個(gè)類中可以有多個(gè)名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個(gè)數(shù)或類型不同)。
重寫Override表示子類中的方法可以與父類中的某個(gè)方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實(shí)例對象調(diào)用這個(gè)方法時(shí),將調(diào)用子類中的定義方法,這相當(dāng)于把父類中定義的那個(gè)完全相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。子類覆蓋父類的方法時(shí),只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因?yàn)樽宇惪梢越鉀Q父類的一些問題,不能比父類有更多的問題。子類方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private類型,那么,子類則不存在覆蓋的限制,相當(dāng)于子類中增加了一個(gè)全新的方法。
至于Overloaded的方法是否可以改變返回值的類型這個(gè)問題,要看你倒底想問什么呢?這個(gè)題目很模糊。如果幾個(gè)Overloaded的方法的參數(shù)列表不一樣,它們的返回者類型當(dāng)然也可以不一樣。但我估計(jì)你想問的問題是:如果兩個(gè)方法的參數(shù)列表完全一樣,是否可以讓它們的返回值不同來實(shí)現(xiàn)重載Overload。這是不行的,我們可以用反證法來說明這個(gè)問題,因?yàn)槲覀冇袝r(shí)候調(diào)用一個(gè)方法時(shí)也可以不定義返回結(jié)果變量,即不要關(guān)心其返回結(jié)果,例如,我們調(diào)用map.remove(key)方法時(shí),雖然remove方法有返回值,但是我們通常都不會定義接收返回結(jié)果的變量,這時(shí)候假設(shè)該類中有兩個(gè)名稱和參數(shù)列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調(diào)用哪個(gè)方法了,因?yàn)樗鼰o法通過返回結(jié)果類型來判斷。
override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個(gè)方法并且對其重寫,以求達(dá)到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實(shí)現(xiàn),在接口中一般只是對方法進(jìn)行了聲明,而我們在實(shí)現(xiàn)時(shí),就需要實(shí)現(xiàn)接口聲明的所有方法。除了這個(gè)典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點(diǎn):
1、覆蓋的方法的標(biāo)志必須要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個(gè)方法,并沒有對其進(jìn)行覆蓋。
overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入?yún)?shù)來區(qū)分這些方法,然后再調(diào)用時(shí),VM就會根據(jù)不同的參數(shù)樣式,來選擇合適的方法執(zhí)行。在使用重載要注意以下的幾點(diǎn):
1、在使用重載時(shí)只能通過不同的參數(shù)樣式。例如,不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序(當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2、不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載;
3、方法的異常類型和數(shù)目不會對重載造成影響;
4、對于繼承來說,如果某一方法在父類中是訪問權(quán)限是priavte,那么就不能在子類對其進(jìn)行重載,如果定義的話,也只是定義了一個(gè)新方法,而不會達(dá)到重載的效果。
18、說說對javaee中的session的理解,你是怎么用session的?
在Java Servlet API中引入session機(jī)制來跟蹤客戶的狀態(tài)。session指的是在一段時(shí)間內(nèi),單個(gè)客戶與Web服務(wù)器的一連串相關(guān)的交互過程。在一個(gè)session中,客戶可能會多次請求同一個(gè)網(wǎng)頁,也有可能請求訪問各種不同的服務(wù)器資源。例如在電子郵件應(yīng)用中,從一個(gè)客戶登錄到電子郵件系統(tǒng)開始,經(jīng)過收信,寫信,和發(fā)信等,直至退出郵件系統(tǒng),整個(gè)過程為一個(gè)session。再比如,在網(wǎng)上書店應(yīng)用中,從一個(gè)客戶開始購物,到最后結(jié)賬,整個(gè)過程為一個(gè)session。
會話的創(chuàng)建:HttpSession session = request.getSession(boolean value);HttpSession session = request.getSession();會話的使用:javax.servlet.http.HttpSession接口中定義的方法,我們常用的是有關(guān)進(jìn)行數(shù)據(jù)存取的方法。
session.setAttribute(String name , Object value);session.getAttribute(String name);
19、說說has a與is a的區(qū)別。
is-a表示的是屬于得關(guān)系。比如兔子屬于一種動(dòng)物(繼承關(guān)系)。has-a表示組合,包含關(guān)系。比如兔子包含有腿,頭等組件;
20、線程如何同步和通訊。
只有多個(gè)synchronized代碼塊使用的是同一個(gè)監(jiān)視器對象,這些synchronized代碼塊之間才具有線程互斥的效果,假如a代碼塊用obj1作為監(jiān)視器對象,假如b代碼塊用obj2作為監(jiān)視器對象,那么,兩個(gè)并發(fā)的線程可以同時(shí)分別進(jìn)入這兩個(gè)代碼塊中。對于同步方法的分析,所用的同步監(jiān)視器對象是this 接著對于靜態(tài)同步方法的分析,所用的同步監(jiān)視器對象是該類的Class對象 接著對如何實(shí)現(xiàn)代碼塊與方法的同步進(jìn)行分析。2.ClassLoader如何加載class。
jvm里有多個(gè)類加載,每個(gè)類加載可以負(fù)責(zé)加載特定位置的類,例如,bootstrap類加載負(fù)責(zé)加載jre/lib/rt.jar中的類,我們平時(shí)用的jdk中的類都位于rt.jar中。
extclassloader負(fù)責(zé)加載jar/lib/ext/*.jar中的類,appclassloader負(fù)責(zé)classpath指定的目錄或jar中的類。除了bootstrap之外,其他的類加載器本身也都是java類,它們的父類是ClassLoader。3.Servlet的生命周期
? 通常情況下,服務(wù)器只會創(chuàng)建一個(gè)Servlet實(shí)例對象,也就是說Servlet實(shí)例對象一旦創(chuàng)建,它就會駐留在內(nèi)存中,為后續(xù)的其它請求服務(wù),直至web容器退出,servlet實(shí)例對象才會銷毀。
Web容器退出,調(diào)用destory方法,結(jié)束servlet; 4.抽象類的作用
5.ArrayList如何實(shí)現(xiàn)插入的數(shù)據(jù)按自定義的方式有序存放 class MyBean implements Comparable{ public int compareTo(Object obj){ if(!obj instanceof MyBean)throw new ClassCastException()//具體異常的名稱,我要查jdk文檔。
MyBean other =(MyBean)obj;return age > other.age?1:age== other.age?0:-1;} }
class MyTreeSet {
private ArrayList datas = new ArrayList();
public void add(Object obj){ for(int i=0;i 6.分層設(shè)計(jì)的好處;把各個(gè)功能按調(diào)用流程進(jìn)行了模塊化,模塊化帶來的好處就是可以隨意組合,舉例說明:如果要注冊一個(gè)用戶,流程為顯示界面并通過界面接收用戶的輸入,接著進(jìn)行業(yè)務(wù)邏輯處理,在處理業(yè)務(wù)邏輯又訪問數(shù)據(jù)庫,如果我們將這些步驟全部按流水帳的方式放在一個(gè)方法中編寫,這也是可以的,但這其中的壞處就是,當(dāng)界面要修改時(shí),由于代碼全在一個(gè)方法內(nèi),可能會碰壞業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問的碼,同樣,當(dāng)修改業(yè)務(wù)邏輯或數(shù)據(jù)庫訪問的代碼時(shí),也會碰壞其他部分的代碼。分層就是要把界面部分、業(yè)務(wù)邏輯部分、數(shù)據(jù)庫訪問部分的代碼放在各自獨(dú)立的方法或類中編寫,這樣就不會出現(xiàn)牽一發(fā)而動(dòng)全身的問題了。這樣分層后,還可以方便切換各層,譬如原來的界面是Swing,現(xiàn)在要改成 BS界面,如果最初是按分層設(shè)計(jì)的,這時(shí)候不需要涉及業(yè)務(wù)和數(shù)據(jù)訪問的代碼,只需編寫一條web界面就可以了。 下面的僅供參考,不建議照搬照套,一定要改成自己的語言,發(fā)現(xiàn)內(nèi)心的感受: 分層的好處: 1,實(shí)現(xiàn)了軟件之間的解耦; 2.便于進(jìn)行分工 3.便于維護(hù) 4,提高軟件組件的重用 5.便于替換某種產(chǎn)品,比如持久層用的是hibernate,需要更換產(chǎn)品用toplink,就不用該其他業(yè)務(wù)代碼,直接把配置一改。6.便于產(chǎn)品功能的擴(kuò)展。 7。便于適用用戶需求的不斷變化 7.序列化接口的id有什么用? 對象經(jīng)常要通過IO進(jìn)行傳送,讓你寫程序傳遞對象,你會怎么做?把對象的狀態(tài)數(shù)據(jù)用某種格式寫入到硬盤,Person->“zxx,male,28,30000”?Person,既然大家都要這么干,并且沒有個(gè)統(tǒng)一的干法,于是,sun公司就提出一種統(tǒng)一的解決方案,它會把對象變成某個(gè)格式進(jìn)行輸入和輸出,這種格式對程序員來說是透明(transparent)的,但是,我們的某個(gè)類要想能被sun的這種方案處理,必須實(shí)現(xiàn)Serializable接口。 ObjectOutputStream.writeObject(obj);Object obj = ObjectInputStream.readObject();假設(shè)兩年前我保存了某個(gè)類的一個(gè)對象,這兩年來,我修改該類,刪除了某個(gè)屬性和增加了另外一個(gè)屬性,兩年后,我又去讀取那個(gè)保存的對象,或有什么結(jié)果?未知!sun的jdk就會蒙了。為此,一個(gè)解決辦法就是在類中增加版本后,每一次類的屬性修改,都應(yīng)該把版本號升級一下,這樣,在讀取時(shí),比較存儲對象時(shí)的版本號與當(dāng)前類的版本號,如果不一致,則直接報(bào)版本號不同的錯(cuò)! 9.hashCode方法的作用?說(網(wǎng)友提供的一段,待改進(jìn):hashcode這個(gè)方法是用來鑒定2個(gè)對象是否相等的。 那你會說,不是還有equals這個(gè)方法嗎? 不錯(cuò),這2個(gè)方法都是用來判斷2個(gè)對象是否相等的。但是他們是有區(qū)別的。一般來講,equals這個(gè)方法是給用戶調(diào)用的,如果你想判斷2個(gè)對象是否相等,你可以重寫equals方法,然后在代碼中調(diào)用,就可以判斷他們是否相等了。簡單來講,equals方法主要是用來判斷從表面上看或者從內(nèi)容上看,2個(gè)對象是不是相等。舉個(gè)例子,有個(gè)學(xué)生類,屬性只有姓名和性別,那么我們可以認(rèn)為只要姓名和性別相等,那么就說這2個(gè)對象是相等的。 hashcode方法一般用戶不會去調(diào)用,比如在hashmap中,由于key是不可以重復(fù)的,他在判斷key是不是重復(fù)的時(shí)候就判斷了hashcode這個(gè)方法,而且也用到了equals方法。這里不可以重復(fù)是說equals和hashcode只要有一個(gè)不等就可以了!所以簡單來講,hashcode相當(dāng)于是一個(gè)對象的編碼,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時(shí)也要覆蓋hashcode,讓他們的邏輯一致。舉個(gè) 例子,還是剛剛的例子,如果姓名和性別相等就算2個(gè)對象相等的話,那么hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。 要從物理上判斷2個(gè)對象是否相等,用==就可以了。) 10.webservice問得很多 11.設(shè)計(jì)出計(jì)算任意正整數(shù)的階層。 4.在oracle數(shù)據(jù)庫中需要查詢出前8條記錄的sql語句怎么寫? Select * from(select *,rownum r from test where r<8) 5.什么是SOA,談?wù)勀愕腟OA的理解。service orientied architecture 面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)是一個(gè)組件模型,它將應(yīng)用程序的不同功能單元(稱為服務(wù))通過這些服務(wù)之間定義良好的接口和契約聯(lián)系起來。接口是采用中立的方式進(jìn)行定義的,它應(yīng)該獨(dú)立于實(shí)現(xiàn)服務(wù)的硬件平臺、操作系統(tǒng)和編程語言。這使得構(gòu)建在各種這樣的系統(tǒng)中的服務(wù)可以一種統(tǒng)一和通用的方式進(jìn)行交互。松耦合的 6.如何實(shí)現(xiàn)線程間的通訊。 新題目:編程:1.編寫一個(gè)函數(shù)將一個(gè)十六進(jìn)制數(shù)的字符串參數(shù)轉(zhuǎn)換成整數(shù)返回。String str = “13abf”;int len = str.length;int sum = 0;for(int i=0;i 其實(shí),也可以用Integer.parseInt(str,16),但面試官很可能是想考我們的編碼基本功。 編程2 :銀行貸款的還款方式中最常用的是一種叫“等額本息”,還款法,即借款人在約定還款期限內(nèi)的每一期(月)歸還的金額(產(chǎn)生的利息+部分本金)都是相等的,現(xiàn)有一筆總額為T元的N年期住房貸款,年利率為R,要求算出每一期的還款的本金和利息總額,請寫出解決思路和任意一種編程語言實(shí)現(xiàn)的主要代碼。思路:既然是按月還款,那我就要將N年按月來計(jì)算,即要還N*12個(gè)月,這樣就可以求出每月要還的本金。由于每月要還的那部分本金所欠的時(shí)間不同,所以, 它們所產(chǎn)生的利息是不同的,該部分本金的利息為:部分本金額*所欠月數(shù)*月利率。應(yīng)該是這么個(gè)算法,如果利息還計(jì)利息,如果月還款不按年利率來算,老百姓算不明白的。 int monthMoney = T/N/12;float monthRate = R/12;int totalMonth = N * 12;float totalRate = 0;for(int i=1;i<=totalMonth;i++){ totalRate += monthMoney * monthRate * i;} int result = monthMoney + totalRate/N/12; 幾道題: 1.****Spring的DI是什么(學(xué)員注:除了IOC,AOP這些概念,還不太清楚DI的概念) 什么是DI機(jī)制? 依賴注入(Dependecy Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念,具體的講:當(dāng)某個(gè)角色 需要另外一個(gè)角色協(xié)助的時(shí)候,在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例。但在spring中 創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn)。創(chuàng)建被調(diào)用者的工作由spring來完成,然后注入調(diào)用者 因此也稱為依賴注入。 spring以動(dòng)態(tài)靈活的方式來管理對象,注入的兩種方式,設(shè)置注入和構(gòu)造注入。 設(shè)置注入的優(yōu)點(diǎn):直觀,自然 構(gòu)造注入的優(yōu)點(diǎn):可以在構(gòu)造器中決定依賴關(guān)系的順序。 2.*任意數(shù)字序列“123456”之類,輸出它們所有的排列組合 2題的答案: String str = “xafdvs”;char[] arr1 = str.toCharArray();char[] arr2 = Arrays.copyOf(arr1,arr1.length);for(int i=0;i 3.*****什么是AOP(學(xué)員注:會用,但感覺說不清楚)什么是AOP? 面向切面編程(AOP)完善spring的依賴注入(DI),面向切面編程在spring中主要表現(xiàn)為兩個(gè)方面 1.面向切面編程提供聲明式事務(wù)管理 2.spring支持用戶自定義的切面 面向切面編程(aop)是對面向?qū)ο缶幊蹋╫op)的補(bǔ)充,面向?qū)ο缶幊虒⒊绦蚍纸獬筛鱾€(gè)層次的對象,面向切面編程將程序運(yùn)行過程分解成各個(gè)切面。 AOP從程序運(yùn)行角度考慮程序的結(jié)構(gòu),提取業(yè)務(wù)處理過程的切面,oop是靜態(tài)的抽象,aop是動(dòng)態(tài)的抽象,是對應(yīng)用執(zhí)行過程中的步驟進(jìn)行抽象,從而獲得步驟之間的邏輯劃分。 aop框架具有的兩個(gè)特征: 1.各個(gè)步驟之間的良好隔離性 2.源代碼無關(guān)性 spring 的優(yōu)點(diǎn)? 1.降低了組件之間的耦合性,實(shí)現(xiàn)了軟件各層之間的解耦 2.可以使用容易提供的眾多服務(wù),如事務(wù)管理,消息服務(wù)等 3.容器提供單例模式支持 4.容器提供了AOP技術(shù),利用它很容易實(shí)現(xiàn)如權(quán)限攔截,運(yùn)行期監(jiān)控等功能 5.容器提供了眾多的輔助類,能加快應(yīng)用的開發(fā) 6.spring對于主流的應(yīng)用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring屬于低侵入式設(shè)計(jì),代碼的污染極低 8.獨(dú)立于各種應(yīng)用服務(wù)器 9.spring的DI機(jī)制降低了業(yè)務(wù)對象替換的復(fù)雜性 10.Spring的高度開放性,并不強(qiáng)制應(yīng)用完全依賴于Spring,開發(fā)者可以自由選擇spring的部分或全部 3題的答案: 1.概念介紹:所謂AOP,即Aspect orientied program,就是面向方面的編程,2.解釋什么是方面:貫穿到系統(tǒng)的各個(gè)模塊中的系統(tǒng)一個(gè)功能就是一個(gè)方面,比如,記錄日志,統(tǒng)一異常處理,事務(wù)處理,全限檢查,這些功能都是軟件系統(tǒng) 的一個(gè)面,而不是一點(diǎn),在各個(gè)模塊中都要出現(xiàn)。 3.什么是面向方面編程:把系統(tǒng)的一個(gè)方面的功能封裝成對象的形式來處理 4.怎么進(jìn)行面向方面編程:把功能模塊對應(yīng)的對象作為切面嵌入到原來的各個(gè)系統(tǒng)模塊中,采用代理技術(shù),代理會調(diào)用目標(biāo),同時(shí)把切面功能的代碼(對象)加入進(jìn)來,所以,用spring配置代理對象時(shí)只要要配兩個(gè)屬性,分別表示目標(biāo)和切面對象(Advisor)。 3、構(gòu)造器Constructor是否可被override? 構(gòu)造器Constructor不能被繼承,因此不能重寫Override,但可以被重載Overload。 4、接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)? 抽象類中是否可以有靜態(tài)的main方法? 接口可以繼承接口。抽象類可以實(shí)現(xiàn)(implements)接口,抽象類可繼承具體類。抽象類中可以有靜態(tài)的main方法。 備注:只要明白了接口和抽象類的本質(zhì)和作用,這些問題都很好回答,你想想,如果你是java語言的設(shè)計(jì)者,你是否會提供這樣的支持,如果不提供的話,有什么理由嗎?如果你沒有道理不提供,那答案就是肯定的了。 只有記住抽象類與普通類的唯一區(qū)別就是不能創(chuàng)建實(shí)例對象和允許有abstract方法。 5、寫clone()方法時(shí),通常都有一行代碼,是什么? clone 有缺省行為,super.clone();因?yàn)槭紫纫迅割愔械某蓡T復(fù)制到位,然后才是復(fù)制自己的成員。 6、面向?qū)ο蟮奶卣饔心男┓矫?/p> 計(jì)算機(jī)軟件系統(tǒng)是現(xiàn)實(shí)生活中的業(yè)務(wù)在計(jì)算機(jī)中的映射,而現(xiàn)實(shí)生活中的業(yè)務(wù)其實(shí)就是一個(gè)個(gè)對象協(xié)作的過程。面向?qū)ο缶幊叹褪前船F(xiàn)實(shí)業(yè)務(wù)一樣的方式將程序代碼按一個(gè)個(gè)對象進(jìn)行組織和編寫,讓計(jì)算機(jī)系統(tǒng)能夠識別和理解用對象方式組織和編寫的程序代碼,這樣就可以把現(xiàn)實(shí)生活中的業(yè)務(wù)對象映射到計(jì)算機(jī)系統(tǒng)中。 面向?qū)ο蟮木幊陶Z言有封裝、繼承、抽象、多態(tài)等4個(gè)主要的特征。1封裝: 封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問同一個(gè)對象中的屬性。通常情況下,只要記住讓變量和訪問這個(gè)變量的方法放在一起,將一個(gè)類中的成員變量全部定義成私有的,只有這個(gè)類自己的方法才可以訪問到這些成員變量,這就基本上實(shí)現(xiàn)對象的封裝,就很容易找出要分配到這個(gè)類上的方法了,就基本上算是會面向?qū)ο蟮木幊塘?。把握一個(gè)原則:把對同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個(gè)類中,把方法和它操作的數(shù)據(jù)放在同一個(gè)類中。 例如,人要在黑板上畫圓,這一共涉及三個(gè)對象:人、黑板、圓,畫圓的方法要分配給哪個(gè)對象呢?由于畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們在類中定義成了私有的成員變量,那么,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個(gè)屬性,人以后只是調(diào)用圓的畫圓方法、表示給圓發(fā)給消息而已,畫圓這個(gè)方法不應(yīng)該分配在人這個(gè)對象上,這就是面向 對象的封裝性,即將對象封裝成一個(gè)高度自治和相對封閉的個(gè)體,對象狀態(tài)(屬性)由這個(gè)對象自己的行為(方法)來讀取和改變。一個(gè)更便于理解的例子就是,司機(jī)將火車剎住了,剎車的動(dòng)作是分配給司機(jī),還是分配給火車,顯然,應(yīng)該分配給火車,因?yàn)樗緳C(jī)自身是不可能有那么大的力氣將一個(gè)火車給停下來的,只有火車自己才能完成這一動(dòng)作,火車需要調(diào)用內(nèi)部的離合器和剎車片等多個(gè)器件協(xié)作才能完成剎車這個(gè)動(dòng)作,司機(jī)剎車的過程只是給火車發(fā)了一個(gè)消息,通知火車要執(zhí)行剎車動(dòng)作而已。 抽象: 抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個(gè)類,這個(gè)類只考慮這些事物的相似和共性之處,并且會忽略與當(dāng)前主題和目標(biāo)無關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象包括行為抽象和狀態(tài)抽象兩個(gè)方面。例如,定義一個(gè)Person類,如下: class Person { String name;int age;} 人本來是很復(fù)雜的事物,有很多方面,但因?yàn)楫?dāng)前系統(tǒng)只需要了解人的姓名和年齡,所以上面定義的類中只包含姓名和年齡這兩個(gè)屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標(biāo)無關(guān)的細(xì)節(jié)。我對抽象的理解就是不要用顯微鏡去看一個(gè)事物的所有方面,這樣涉及的內(nèi)容就太多了,而是要善于劃分問題的邊界,當(dāng)前系統(tǒng)需要什么,就只考慮什么。 繼承: 在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動(dòng)共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。 多態(tài): 多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會指向哪個(gè)類的實(shí)例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。例如,下面代碼中的UserDao是一個(gè)接口,它定義引用變量userDao指向的實(shí)例對象由daofactory.getDao()在執(zhí)行的時(shí)候返回,有時(shí)候指向的是UserJdbcDao這個(gè)實(shí)現(xiàn),有時(shí)候指向的是UserHibernateDao這個(gè)實(shí)現(xiàn),這樣,不用修改源代碼,就可以改變userDao指向的具體類實(shí)現(xiàn),從而導(dǎo)致 userDao.insertUser()方法調(diào)用的具體代碼也隨之改變,即有時(shí)候調(diào)用的是UserJdbcDao的insertUser方法,有時(shí)候調(diào)用的是UserHibernateDao的insertUser方法: UserDao userDao = daofactory.getDao();userDao.insertUser(user); 比喻:人吃飯,你看到的是左手,還是右手? 7、java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么? 靠的是父類或接口定義的引用變量可以指向子類或具體實(shí)現(xiàn)類的實(shí)例對象,而程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定,就是引用變量所指向的具體實(shí)例對象的方法,也就是內(nèi)存里正在運(yùn)行的那個(gè)對象的方法,而不是引用變量的類型中定義的方法。 8、abstract class和interface有什么區(qū)別? 含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法。如果的子類沒有實(shí)現(xiàn)抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。 接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認(rèn)為public abstract類型,接口中的成員變量類型默認(rèn)為public static final。 下面比較一下兩者的語法區(qū)別: 1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。 2.抽象類中可以有普通成員變量,接口中沒有普通成員變量 3.抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。 4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然 eclipse下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。 5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法 6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認(rèn)即為public static final類型。 7.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。下面接著再說說兩者在應(yīng)用上的區(qū)別: 接口更多的是在系統(tǒng)架構(gòu)設(shè)計(jì)方法發(fā)揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實(shí)現(xiàn)方面發(fā)揮作用,可以實(shí)現(xiàn)代碼的重用,例如,模板方法設(shè)計(jì)模式是抽象類的一個(gè)典型應(yīng)用,假設(shè)某個(gè)項(xiàng)目的所有Servlet類都要用相 同的方式進(jìn)行權(quán)限判斷、記錄訪問日志和處理異常,那么就可以定義一個(gè)抽象的基類,讓所有的Servlet都繼承這個(gè)抽象基類,在抽象基類的service方法中完成權(quán)限判斷、記錄訪問日志和處理異常的代碼,在各個(gè)子類中只是完成各自的業(yè)務(wù)邏輯代碼,偽代碼如下: public abstract class BaseServlet extends HttpServlet { public final void service(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException { 記錄訪問日志 進(jìn)行權(quán)限判斷 if(具有權(quán)限){ try { doService(request,response);} catch(Excetpion e){ 記錄異常信息 } } } protected abstract void doService(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException;//注意訪問權(quán)限定義成protected,顯得既專業(yè),又嚴(yán)謹(jǐn),因?yàn)樗菍iT給子類用的 } public class MyServlet1 extends BaseServlet { protected void doService(HttpServletRequest request, HttpServletResponse response)throws IOExcetion,ServletException { 本Servlet只處理的具體業(yè)務(wù)邏輯代碼 } } 父類方法中間的某段代碼不確定,留給子類干,就用模板方法設(shè)計(jì)模式。備注:這道題的思路是先從總體解釋抽象類和接口的基本概念,然后再比較兩者的語法細(xì)節(jié),最后再說兩者的應(yīng)用區(qū)別。比較兩者語法細(xì)節(jié)區(qū)別的條理是:先從一個(gè)類中的構(gòu)造方法、普通成員變量和方法(包括抽象方法),靜態(tài)變量和方法,繼承性等6個(gè)方面逐一去比較回答,接著從 9、abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized? abstract的method 不可以是static的,因?yàn)槌橄蟮姆椒ㄊ且蛔宇悓?shí)現(xiàn)的,而static與子類扯不上關(guān)系! native方法表示該方法要用另外一種依賴平臺的編程語言實(shí)現(xiàn)的,不存在著被子類實(shí)現(xiàn)的問題,所以,它也不能是抽象的,不能與abstract混用。例如,F(xiàn)ileOutputSteam類要硬件打交道,底層的實(shí)現(xiàn)用的是操作系統(tǒng)相關(guān)的api實(shí)現(xiàn),例如,在windows用c語言實(shí)現(xiàn)的,所以,查看jdk 的源代碼,可以發(fā)現(xiàn)FileOutputStream的open方法的定義如下: private native void open(String name)throws FileNotFoundException;如果我們要用java調(diào)用別人寫的c語言函數(shù),我們是無法直接調(diào)用的,我們需要按照java的要求寫一個(gè)c語言的函數(shù),又我們的這個(gè)c語言函數(shù)去調(diào)用別人的c語言函數(shù)。由于我們的c語言函數(shù)是按java的要求來寫的,我們這個(gè)c語言函數(shù)就可以與java對接上,java那邊的對接方式就是定義出與我們這個(gè)c函數(shù)相對應(yīng)的方法,java中對應(yīng)的方法不需要寫具體的代碼,但需要在前面聲明native。關(guān)于synchronized與abstract合用的問題,我覺得也不行,因?yàn)樵谖規(guī)啄甑膶W(xué)習(xí)和開發(fā)中,從來沒見到過這種情況,并且我覺得synchronized應(yīng)該是作用在一個(gè)具體的方法上才有意義。而且,方法上的synchronized同步所使用的同步鎖對象是this,而抽象方法上無法確定this是什么。 10、什么是內(nèi)部類?Static Nested Class 和 Inner Class的不同。 內(nèi)部類就是在一個(gè)類的內(nèi)部定義的類,內(nèi)部類中不能定義靜態(tài)成員(靜態(tài)成員不是對象的特性,只是為了找一個(gè)容身之處,所以需要放到一個(gè)類中而已,這么一點(diǎn)小事,你還要把它放到類內(nèi)部的一個(gè)類中,過分了??!提供內(nèi)部類,不是為讓你干這種事情,無聊,不讓你干。我想可能是既然靜態(tài)成員類似c語言的全局變量,而內(nèi)部類通常是用于創(chuàng)建內(nèi)部對象用的,所以,把“全局變量”放在內(nèi)部類中就是毫無意義的事情,既然是毫無意義的事情,就應(yīng)該被禁止),內(nèi)部類可以直接訪問外部類中的成員變量,內(nèi)部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示: public class Outer { int out_x = 0;public void method() { Inner1 inner1 = new Inner1();public class Inner2 //在方法體內(nèi)部定義的內(nèi)部類 { public method(){ out_x = 3;} } Inner2 inner2 = new Inner2();} public class Inner1 //在方法體外面定義的內(nèi)部類 { } } 在方法體外面定義的內(nèi)部類的訪問類型可以是public,protecte,默認(rèn)的,private等4種類型,這就好像類中定義的成員變量有4種訪問類型一樣,它們決定這個(gè)內(nèi)部類的定義對其他類是否可見;對于這種情況,我們也可以在外面創(chuàng)建內(nèi)部類的實(shí)例對象,創(chuàng)建內(nèi)部類的實(shí)例對象時(shí),一定要先創(chuàng)建外部類的實(shí)例對象,然后用這個(gè)外部類的實(shí)例對象去創(chuàng)建內(nèi)部類的實(shí)例對象,代碼如下: Outer outer = new Outer();Outer.Inner1 inner1 = outer.new Innner1(); 在方法內(nèi)部定義的內(nèi)部類前面不能有訪問類型修飾符,就好像方法中定義的局部變量一樣,但這種內(nèi)部類的前面可以使用final或abstract修飾符。這種內(nèi)部類對其他類是不可見的其他類無法引用這種內(nèi)部類,但是這種內(nèi)部類創(chuàng)建的實(shí)例對象可以傳遞給其他類訪問。這種內(nèi)部類必須是先定義,后使用,即內(nèi)部類的定義代碼必須出現(xiàn)在使用該類之前,這與方法中的局部變量必須先定義后使用的道理也是一樣的。這種內(nèi)部類可以訪問方法體中的局部變量,但是,該局部變量前必須加final修飾符。 對于這些細(xì)節(jié),只要在eclipse寫代碼試試,根據(jù)開發(fā)工具提示的各類錯(cuò)誤信息就可以馬上了解到。 在方法體內(nèi)部還可以采用如下語法來創(chuàng)建一種匿名內(nèi)部類,即定義某一接口或類的子類的同時(shí),還創(chuàng)建了該子類的實(shí)例對象,無需為該子類定義名稱: public class Outer { public void start(){ new Thread(new Runable(){ public void run(){};}).start();} } 最后,在方法外部定義的內(nèi)部類前面可以加上static關(guān)鍵字,從而成為Static Nested Class,它不再具有內(nèi)部類的特性,所有,從狹義上講,它不是內(nèi)部類。Static Nested Class與普通類在運(yùn)行時(shí)的行為和功能上沒有什么區(qū)別,只是在編程 引用時(shí)的語法上有一些差別,它可以定義成public、protected、默認(rèn)的、private等多種類型,而普通類只能定義成public和默認(rèn)的這兩種類型。在外面引用Static Nested Class類的名稱為“外部類名.內(nèi)部類名”。在外面不需要?jiǎng)?chuàng)建外部類的實(shí)例對象,就可以直接創(chuàng)建Static Nested Class,例如,假設(shè)Inner是定義在Outer類中的Static Nested Class,那么可以使用如下語句創(chuàng)建Inner類: Outer.Inner inner = new Outer.Inner();由于static Nested Class不依賴于外部類的實(shí)例對象,所以,static Nested Class能訪問外部類的非static成員變量。當(dāng)在外部類中訪問Static Nested Class時(shí),可以直接使用Static Nested Class的名字,而不需要加上外部類的名字了,在Static Nested Class中也可以直接引用外部類的static的成員變量,不需要加上外部類的名字。 在靜態(tài)方法中定義的內(nèi)部類也是Static Nested Class,這時(shí)候不能在類前面加static關(guān)鍵字,靜態(tài)方法中的Static Nested Class與普通方法中的內(nèi)部類的應(yīng)用方式很相似,它除了可以直接訪問外部類中的static的成員變量,還可以訪問靜態(tài)方法中的局部變量,但是,該局部變量前必須加final修飾符。 備注:首先根據(jù)你的印象說出你對內(nèi)部類的總體方面的特點(diǎn):例如,在兩個(gè)地方可以定義,可以訪問外部類的成員變量,不能定義靜態(tài)成員,這是大的特點(diǎn)。然后再說一些細(xì)節(jié)方面的知識,例如,幾種定義方式的語法區(qū)別,靜態(tài)內(nèi)部類,以及匿名內(nèi)部類。 11、內(nèi)部類可以引用它的包含類的成員嗎?有沒有什么限制? 完全可以。如果不是靜態(tài)內(nèi)部類,那沒有什么限制! 如果你把靜態(tài)嵌套類當(dāng)作內(nèi)部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而只能訪問外部類中的靜態(tài)成員,例如,下面的代碼: class Outer { static int x;static class Inner { void test(){ syso(x);} } } 答題時(shí),也要能察言觀色,揣摩提問者的心思,顯然人家希望你說的是靜態(tài)內(nèi)部類不能訪問外部類的成員,但你一上來就頂牛,這不好,要先順著人家,讓人家滿意,然后再說特殊情況,讓人家吃驚。 12、Anonymous Inner Class(匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)? 可以繼承其他類或?qū)崿F(xiàn)其他接口。不僅是可以,而是必須! 13、super.getClass()方法調(diào)用 下面程序的輸出結(jié)果是多少? import java.util.Date;public class Test extends Date{ public static void main(String[] args){ new Test().test();} public void test(){ System.out.println(super.getClass().getName());} } 很奇怪,結(jié)果是Test 這屬于腦筋急轉(zhuǎn)彎的題目,在一個(gè)qq群有個(gè)網(wǎng)友正好問過這個(gè)問題,我覺得挺有趣,就研究了一下,沒想到今天還被你面到了,哈哈。 在test方法中,直接調(diào)用getClass().getName()方法,返回的是Test類名 由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在 test方法中調(diào)用getClass().getName()方法,其實(shí)就是在調(diào)用從父類繼承的getClass()方法,等效于調(diào)用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應(yīng)該是Test。如果想得到父類的名稱,應(yīng)該用如下代碼: getClass().getSuperClass().getName(); 14.jdk中哪些類是不能繼承的? 不能繼承的是類是那些用final關(guān)鍵字修飾的類。一般比較基本的類型或防止擴(kuò)展類無意間破壞原來方法的實(shí)現(xiàn)的類型都應(yīng)該是final的,在jdk中System,String,StringBuffer等都是基本類型。 2、String是最基本的數(shù)據(jù)類型嗎? 基本數(shù)據(jù)類型包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不可以繼承這個(gè)類、不能修改這個(gè)類。為了提高效率節(jié)省空間,我們應(yīng)該用StringBuffer類 111、String s = ”Hello“;s = s + ” world!“;這兩行代碼執(zhí)行后,原始的String對象中的內(nèi)容到底變了沒有? 沒有。因?yàn)镾tring被設(shè)計(jì)成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s原先指向一個(gè)String對象,內(nèi)容是 ”Hello“,然后我們對s進(jìn)行了+操作,那么s所指向的那個(gè)對象是否發(fā)生了改變呢?答案是沒有。這時(shí),s不指向原來那個(gè)對象了,而指向了另一個(gè) String對象,內(nèi)容為”Hello world!“,原來那個(gè)對象還存在于內(nèi)存之中,只是s這個(gè)引用變量不再指向它了。 通過上面的說明,我們很容易導(dǎo)出另一個(gè)結(jié)論,如果經(jīng)常對字符串進(jìn)行各種各樣的修改,或者說,不可預(yù)見的修改,那么使用String來代表字符串的話會引起很大的內(nèi)存開銷。因?yàn)?String對象建立之后不能再改變,所以對于每一個(gè)不同的字符串,都需要一個(gè)String對象來表示。這時(shí),應(yīng)該考慮使用StringBuffer類,它允許修改,而不是每個(gè)不同的字符串都要生成一個(gè)新的對象。并且,這兩種類的對象轉(zhuǎn)換十分容易。 同時(shí),我們還可以知道,如果要使用內(nèi)容相同的字符串,不必每次都new一個(gè)String。例如我們要在構(gòu)造器中對一個(gè)名叫s的String引用變量進(jìn)行初始化,把它設(shè)置為初始值,應(yīng)當(dāng)這樣做: public class Demo { private String s;...public Demo { s = ”Initial Value“;}...} 而非 s = new String(”Initial Value“); 后者每次都會調(diào)用構(gòu)造器,生成新對象,性能低下且內(nèi)存開銷大,并且沒有意義,因?yàn)镾tring對象不可改變,所以對于內(nèi)容相同的字符串,只要一個(gè)String對象來表示就可以了。也就說,多次調(diào)用上面的構(gòu)造器創(chuàng)建多個(gè)對象,他們的String類型屬性s都指向同一個(gè)對象。 上面的結(jié)論還基于這樣一個(gè)事實(shí):對于字符串常量,如果內(nèi)容相同,Java認(rèn)為它們代表同一個(gè)String對象。而用關(guān)鍵字new調(diào)用構(gòu)造器,總是會創(chuàng)建一個(gè)新的對象,無論內(nèi)容是否相同。 至于為什么要把String類設(shè)計(jì)成不可變類,是它的用途決定的。其實(shí)不只String,很多Java標(biāo)準(zhǔn)類庫中的類都是不可變的。在開發(fā)一個(gè)系統(tǒng)的時(shí)候,我們有時(shí)候也需要設(shè)計(jì)不可變類,來傳遞一組相關(guān)的值,這也是面向?qū)ο笏枷氲捏w現(xiàn)。不可變類有一些優(yōu)點(diǎn),比如因?yàn)樗膶ο笫侵蛔x的,所以多線程并發(fā)訪問也不會有任何問題。當(dāng)然也有一些缺點(diǎn),比如每個(gè)不同的狀態(tài)都要一個(gè)對象來代表,可能會造成性能上的問題。所以Java標(biāo)準(zhǔn)類庫還提供了一個(gè)可變版本,即 StringBuffer。 41、是否可以繼承String類? String類是final類故不可以繼承。 27、String s = new String(”xyz“);創(chuàng)建了幾個(gè)String Object? 二者之間有什么區(qū)別? 兩個(gè)或一個(gè),”xyz”對應(yīng)一個(gè)對象,這個(gè)對象放在字符串常量緩沖區(qū),常量”xyz”不管出現(xiàn)多少遍,都是緩沖區(qū)中的那一個(gè)。New String每寫一遍,就創(chuàng)建一個(gè)新的對象,它一句那個(gè)常量”xyz”對象的內(nèi)容來創(chuàng)建出一個(gè)新String對象。如果以前就用過’xyz’,這句代表就不會創(chuàng)建”xyz”自己了,直接從緩沖區(qū)拿。 5、String 和StringBuffer的區(qū)別 JAVA平臺提供了兩個(gè)類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個(gè)字符的字符數(shù)據(jù)。String類表示內(nèi)容不可改變的字符串。而StringBuffer類表示內(nèi)容可以被修改的字符串。當(dāng)你知道字符數(shù)據(jù)要改變的時(shí)候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動(dòng)態(tài)構(gòu)造字符數(shù)據(jù)。另外,String實(shí)現(xiàn)了equals方法,new String(“abc”).equals(new String(“abc”)的結(jié)果為true,而StringBuffer沒有實(shí)現(xiàn)equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的結(jié)果為false。 接著要舉一個(gè)具體的例子來說明,我們要把1到100的所有數(shù)字拼起來,組成一個(gè)串。 StringBuffer sbf = new StringBuffer(); for(int i=0;i<100;i++){ sbf.append(i);} 上面的代碼效率很高,因?yàn)橹粍?chuàng)建了一個(gè)StringBuffer對象,而下面的代碼效率很低,因?yàn)閯?chuàng)建了101個(gè)對象。String str = new String();for(int i=0;i<100;i++){ str = str + i;} 在講兩者區(qū)別時(shí),應(yīng)把循環(huán)的次數(shù)搞成10000,然后用endTime-beginTime來比較兩者執(zhí)行的時(shí)間差異,最后還要講講StringBuilder與StringBuffer的區(qū)別。 String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer對象存儲進(jìn)Java集合類中時(shí)會出現(xiàn)問題。 8.StringBuffer與StringBuilder的區(qū)別 StringBuffer和StringBuilder類都表示內(nèi)容可以被修改的字符串,StringBuilder是線程不安全的,運(yùn)行效率高,如果一個(gè)字符串變量是在方法里面定義,這種情況只可能有一個(gè)線程訪問它,不存在不安全的因素了,則用StringBuilder。如果要在類里面定義成員變量,并且這個(gè)類的實(shí)例對象會在多線程環(huán)境下使用,那么最好用StringBuffer。 3、如何把一段逗號分割的字符串轉(zhuǎn)換成一個(gè)數(shù)組? 如果不查jdk api,我很難寫出來!我可以說說我的思路: 1.用正則表達(dá)式,代碼大概為:String [] result = orgStr.split(“,”);2.用 StingTokenizer ,代碼為:StringTokenizer tokener = StringTokenizer(orgStr,”,”);String [] result = new String[tokener.countTokens()];Int i=0;while(tokener.hasNext(){result[i++]=toker.nextToken();} 38、數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法? 數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個(gè)方法。 39、下面這條語句一共創(chuàng)建了多少個(gè)對象:String s=”a“+”b“+”c“+”d“;答:對于如下代碼: String s1 = ”a“;String s2 = s1 + ”b“;String s3 = ”a“ + ”b“;System.out.println(s2 == ”ab“);System.out.println(s3 == ”ab“); } finally { ++x;} } } ---------執(zhí)行結(jié)果---------1 運(yùn)行結(jié)果是1,為什么呢?主函數(shù)調(diào)用子函數(shù)并得到結(jié)果的過程,好比主函數(shù)準(zhǔn)備一個(gè)空罐子,當(dāng)子函數(shù)要返回結(jié)果時(shí),先把結(jié)果放在罐子里,然后再將程序邏輯返回到主函數(shù)。所謂返回,就是子函數(shù)說,我不運(yùn)行了,你主函數(shù)繼續(xù)運(yùn)行吧,這沒什么結(jié)果可言,結(jié)果是在說這話之前放進(jìn)罐子里的。 7、下面的程序代碼輸出的結(jié)果是多少? public class smallT { public static void main(String args[]){ smallT t = new smallT();int b = t.get();System.out.println(b);} public int get(){ try { return 1;} finally { return 2;} } } 返回的結(jié)果是2。 我可以通過下面一個(gè)例子程序來幫助我解釋這個(gè)答案,從下面例子的運(yùn)行結(jié)果中可以發(fā)現(xiàn),try中的return語句調(diào)用的函數(shù)先于finally中調(diào)用的函數(shù)執(zhí)行,也就是說return語句先執(zhí)行,finally語句后執(zhí)行,所以,返回的結(jié)果是2。Return并不是讓函數(shù)馬上返回,而是return語句執(zhí)行后,將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,它要執(zhí)行finally語句后才真正開始返回。在講解答案時(shí)可以用下面的程序來幫助分析: public class Test { /** * @param args add by zxx ,Dec 9, 2008 */ public static void main(String[] args){ // TODO Auto-generated method stub System.out.println(new Test().test());;} int test(){ try { return func1();} finally { return func2();} } int func1(){ System.out.println(”func1“);return 1;} int func2(){ System.out.println(”func2“);return 2;} }-----------執(zhí)行結(jié)果----------------- func1 func2 2 結(jié)論:finally中的代碼比return 和break語句后執(zhí)行 12、final, finally, finalize的區(qū)別。 final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。 內(nèi)部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼…… finally是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行。 finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會調(diào)用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。JVM不保證此方法總被調(diào)用 5、運(yùn)行時(shí)異常與一般異常有何異同? 異常表示程序運(yùn)行過程中可能出現(xiàn)的非正常狀態(tài),運(yùn)行時(shí)異常表示虛擬機(jī)的通常操作中可能遇到的異常,是一種常見運(yùn)行錯(cuò)誤。java編譯器要求方法必須聲明拋出可能發(fā)生的非運(yùn)行時(shí)異常,但是并不要求必須聲明拋出未被捕獲的運(yùn)行時(shí)異常。 15、error和exception有什么區(qū)別? error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問題。比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況。exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問題。也就是說,它表示如果程序運(yùn)行正常,從不會發(fā)生的情況。 50、Java中的異常處理機(jī)制的簡單原理和應(yīng)用。 異常是指java程序運(yùn)行時(shí)(非編譯)所發(fā)生的非正常情況或錯(cuò)誤,與現(xiàn)實(shí)生活中的事件很相似,現(xiàn)實(shí)生活中的事件可以包含事件發(fā)生的時(shí)間、地點(diǎn)、人物、情節(jié)等信息,可以用一個(gè)對象來表示,Java使用面向?qū)ο蟮姆绞絹硖幚懋惓?,它把程序中發(fā)生的每個(gè)異常也都分別封裝到一個(gè)對象來表示的,該對象中包含有異常的信息。 Java對異常進(jìn)行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:Error和Exception,Error 表示應(yīng)用程序本身無法克服和恢復(fù)的一種嚴(yán)重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。Exception表示程序還能 夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問題,也就是軟件開發(fā)人員考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如,數(shù)組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉(zhuǎn)換異常(ClassCastException);普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如,網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。 java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制普通異常必須try..catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為checked異常,而系統(tǒng)異常可以處理也可以不處理,所以,編譯器不強(qiáng)制用try..catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常。 提示答題者:就按照三個(gè)級別去思考:虛擬機(jī)必須宕機(jī)的錯(cuò)誤,程序可以死掉也可以不死掉的錯(cuò)誤,程序不應(yīng)該死掉的錯(cuò)誤; 33、請寫出你最常見到的5個(gè)runtime exception。 這道題主要考你的代碼量到底多大,如果你長期寫代碼的,應(yīng)該經(jīng)常都看到過一些系統(tǒng)方面的異常,你不一定真要回答出5個(gè)具體的系統(tǒng)異常,但你要能夠說出什么是系統(tǒng)異常,以及幾個(gè)系統(tǒng)異常就可以了,當(dāng)然,這些異常完全用其英文名稱來寫是最好的,如果實(shí)在寫不出,那就用中文吧,有總比沒有強(qiáng)! 所謂系統(tǒng)異常,就是…..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就可以看到其所有的子類列表,也就是看到了所有的系統(tǒng)異常。我比較有印象的系統(tǒng)異常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。unknowntypeException illegalArgumentException 96、JAVA語言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義?在try塊中可以拋出異常嗎? 99、java中有幾種方法可以實(shí)現(xiàn)一個(gè)線程?用什么關(guān)鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用? java5以前,有如下兩種: 表示一個(gè)Thread的匿名子類的實(shí)例對象,子類加上run方法后的代碼如下: new Thread(){ public void run(){ } }.start(); notify()重新啟動(dòng)線程。 13、sleep()和 wait()有什么區(qū)別?(網(wǎng)上的答案:sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會自動(dòng)恢復(fù)。調(diào)用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)致本線程放棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。) sleep就是正在執(zhí)行的線程主動(dòng)讓出cpu,cpu去執(zhí)行其他線程,在sleep指定的時(shí)間過后,cpu才會回到這個(gè)線程上繼續(xù)往下執(zhí)行,如果當(dāng)前線程進(jìn)入了同步鎖,sleep方法并不會釋放鎖,即使當(dāng)前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執(zhí)行。wait是指在一個(gè)已經(jīng)進(jìn)入了同步鎖的線程內(nèi),讓自己暫時(shí)讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運(yùn)行,只有其他線程調(diào)用了notify方法(notify并不釋放鎖,只是告訴調(diào)用過wait方法的線程可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因?yàn)殒i還在別人手里,別人還沒釋放。如果notify方法后面的代碼還有很多,需要這些代碼執(zhí)行完后才會釋放鎖,可以在notfiy方法后增加一個(gè)等待和一些代碼,看看效果),調(diào)用wait方法的線程就會解除wait狀態(tài)和程序可以再次得到鎖后繼續(xù)向下運(yùn)行。對于wait的講解一定要配合例子代碼來說明,才顯得自己真明白。package com.huawei.interview; public class MultiThread { /** * @param args */ public static void main(String[] args){ // TODO Auto-generated method stub new Thread(new Thread1()).start();try { Thread.sleep(10);} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();} new Thread(new Thread2()).start();} private static class Thread1 implements Runnable { @Override public void run(){ // TODO Auto-generated method stub //由于這里的Thread1和下面的Thread2內(nèi)部run方法要用同一對象作為監(jiān)視器,我們這里不能用this,因?yàn)樵赥hread2里面的this和這個(gè)Thread1的this不是同一個(gè)對象。我們用MultiThread.class這個(gè)字節(jié)碼對象,當(dāng)前虛擬機(jī)里引用這個(gè)變量時(shí),指向的都是同一個(gè)對象。synchronized(MultiThread.class){ System.out.println(”enter thread1...“); System.out.println(”thread1 is waiting“);try { //釋放鎖有兩種方式,System.out.println(”enter thread2...“); System.out.println(”thread2 notify other thread can release wait status..“);//由于notify方法并不釋放鎖,即使thread2調(diào)用下面的sleep方法休息了10毫秒,但thread1仍然不會執(zhí)行,因?yàn)閠hread2沒有釋放鎖,所以Thread1無法得不到鎖。 MultiThread.class.notify(); System.out.println(”thread2 is sleeping millisecond...“);try { Thread.sleep(10);} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();} System.out.println(”thread2 is going on...“);System.out.println(”thread2 is being over!“);} } } } 16、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。 如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就是共享數(shù)據(jù),必須進(jìn)行同步存取。 當(dāng)應(yīng)用程序在對象上調(diào)用了一個(gè)需要花費(fèi)很長時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。 ten 17.下面兩個(gè)方法同步嗎?(自己發(fā)明) class Test { synchronized static void sayHello3(){ } synchronized void getX(){} } 56、多線程有幾種實(shí)現(xiàn)方法?同步有幾種實(shí)現(xiàn)方法? 多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接口 同步的實(shí)現(xiàn)方面有兩種,分別是synchronized,wait與notify wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對象的lock。 sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。 notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級。 Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對象的鎖,而是讓它們競爭。 30、啟動(dòng)一個(gè)線程是用run()還是start()?.啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程就緒狀態(tài),以后可以被調(diào)度為運(yùn)行狀態(tài),一個(gè)線程必須關(guān)聯(lián)一些具體的執(zhí)行代碼,run()方法是該線程所關(guān)聯(lián)的執(zhí)行代碼。 47、當(dāng)一個(gè)線程進(jìn)入一個(gè)對象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對象的其它方法? 分幾種情況: 1.其他方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。 2.如果這個(gè)方法內(nèi)部調(diào)用了wait,則可以進(jìn)入其他synchronized方法。 3.如果其他個(gè)方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。 4.如果其他方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因?yàn)榉庆o態(tài)的方法用的是this。 58、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系 一個(gè)程序中可以有多條執(zhí)行線索同時(shí)執(zhí)行,一個(gè)線程就是程序中的一條執(zhí)行線索,每個(gè)線程上都關(guān)聯(lián)有要執(zhí)行的代碼,即可以有多段程序代碼同時(shí)運(yùn)行,每個(gè)程序至少都有一個(gè)線程,即main方法執(zhí)行的那個(gè)線程。如果只是一個(gè)cpu,它怎么能夠同時(shí)執(zhí)行多段程序呢?這是從宏觀上來看的,cpu一會執(zhí)行a線索,一會執(zhí)行b線索,切換時(shí)間很快,給人的感覺是a,b在同時(shí)執(zhí)行,好比大家在同一個(gè)辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線,其實(shí),這條網(wǎng)線一會為a傳數(shù)據(jù),一會為b傳數(shù)據(jù),由于切換時(shí)間很短暫,所以,大家感覺都在同時(shí)上網(wǎng)。 狀態(tài):就緒,運(yùn)行,synchronize阻塞,wait和sleep掛起,結(jié)束。wait必須在synchronized內(nèi)部調(diào)用。 調(diào)用線程的start方法后線程進(jìn)入就緒狀態(tài),線程調(diào)度系統(tǒng)將就緒狀態(tài)的線程轉(zhuǎn)為運(yùn)行狀態(tài),遇到synchronized語句時(shí),由運(yùn)行狀態(tài)轉(zhuǎn)為阻塞,當(dāng)synchronized獲得鎖后,由阻塞轉(zhuǎn)為運(yùn)行,在這種情況可以調(diào)用wait方法轉(zhuǎn)為掛起狀態(tài),當(dāng)線程關(guān)聯(lián)的代碼執(zhí)行完后,線程變?yōu)榻Y(jié)束狀態(tài)。 71、簡述synchronized和java.util.concurrent.locks.Lock的異同 ? 主要相同點(diǎn):Lock能完成synchronized所實(shí)現(xiàn)的所有功能 主要不同點(diǎn):Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強(qiáng)大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。 舉例說明(對下面的題用lock進(jìn)行了改寫): package com.huawei.interview; import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; public class ThreadTest { /** * @param args */ private int j; private Lock lock = new ReentrantLock();public static void main(String[] args){ // TODO Auto-generated method stub ThreadTest tt = new ThreadTest();for(int i=0;i<2;i++){ new Thread(tt.new Adder()).start();new Thread(tt.new Subtractor()).start();} } private class Subtractor implements Runnable { @Override public void run(){ // TODO Auto-generated method stub while(true){ /*synchronized(ThreadTest.this){ System.out.println(”j--=“ + j--);//這里拋異常了,鎖能釋放嗎? }*/ lock.lock();try { System.out.println(”j--=“ + j--);}finally { lock.unlock();} } } } private class Adder implements Runnable { @Override public void run(){ // TODO Auto-generated method stub while(true) { /*synchronized(ThreadTest.this){ System.out.println(”j++=“ + j++);}*/ lock.lock();try { System.out.println(”j++=“ + j++);}finally { lock.unlock();} } } } } 28、設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對j增加1,另外兩個(gè)線程對j每次減少1。寫出程序。 以下程序使用內(nèi)部類實(shí)現(xiàn)線程,對j增減的時(shí)候沒有考慮順序問題。public class ThreadTest1 { private int j;public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1();Inc inc=tt.new Inc();Dec dec=tt.new Dec();for(int i=0;i<2;i++){ Thread t=new Thread(inc);t.start();t=new Thread(dec);t.start();} } private synchronized void inc(){ j++;System.out.println(Thread.currentThread().getName()+”-inc:“+j);} private synchronized void dec(){ j--;System.out.println(Thread.currentThread().getName()+”-dec:“+j); } class Inc implements Runnable{ public void run(){ for(int i=0;i<100;i++){ inc();} } } class Dec implements Runnable{ public void run(){ for(int i=0;i<100;i++){ dec();} } } } ----------隨手再寫的一個(gè)-------------class A { JManger j =new JManager();main(){ new A().call();} void call { for(int i=0;i<2;i++){ new Thread(new Runnable(){ public void run(){while(true){j.accumulate()}}}).start();new Thread(new Runnable(){ public void run(){while(true){j.sub()}}}).start();} } } class JManager { private j = 0; public synchronized void subtract(){ j--} public synchronized void accumulate(){ j++;} } 28、子線程循環(huán)10次,接著主線程循環(huán)100,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)100,如此循環(huán)50次,請寫出程序。 最終的程序代碼如下: public class ThreadTest { /** * @param args */ public static void main(String[] args){ // TODO Auto-generated method stub new ThreadTest().init();} public void init(){ final Business business = new Business();new Thread(new Runnable(){ public void run(){ for(int i=0;i<50;i++){ business.SubThread(i);} } } ).start(); for(int i=0;i<50;i++){ business.MainThread(i);} } private class Business { boolean bShouldSub = true;//這里相當(dāng)于定義了控制該誰執(zhí)行的一個(gè)信號燈 public synchronized void MainThread(int i){ if(bShouldSub)try { this.wait();} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();} for(int j=0;j<5;j++){ System.out.println(Thread.currentThread().getName()”:i=“ + i +”,j=“ + j);} bShouldSub = true;this.notify();} public synchronized void SubThread(int i){ if(!bShouldSub)try { this.wait();} catch(InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace();} + for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”:i=“ + i +”,j=“ + j);} bShouldSub = false;this.notify();} } } 備注:不可能一上來就寫出上面的完整代碼,最初寫出來的代碼如下,問題在于兩個(gè)線程的代碼要參照同一個(gè)變量,即這兩個(gè)線程的代碼要共享數(shù)據(jù),所以,把這兩個(gè)線程的執(zhí)行代碼搬到同一個(gè)類中去: package com.huawei.interview.lym; public class ThreadTest { private static boolean bShouldMain = false; public static void main(String[] args){ // TODO Auto-generated method stub /*new Thread(){ public void run(){ for(int i=0;i<50;i++){ for(int j=0;j<10;j++){ System.out.println(”i=“ + i + ”,j=“ + j);} } } }.start();*/ //final String str = new String(”“); new Thread(new Runnable(){ public void run() { for(int i=0;i<50;i++){ synchronized(ThreadTest.class){ if(bShouldMain){ try { ThreadTest.class.wait();} catch(InterruptedException e){ e.printStackTrace();} } for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);} bShouldMain = true;ThreadTest.class.notify();} } } }).start(); for(int i=0;i<50;i++){ synchronized(ThreadTest.class){ if(!bShouldMain){ try { ThreadTest.class.wait();} catch(InterruptedException e){ e.printStackTrace();} } for(int j=0;j<5;j++){ System.out.println(Thread.currentThread().getName()+ ”i=“ + i + ”,j=“ + j);} bShouldMain = false; ThreadTest.class.notify();} } } } 下面使用jdk5中的并發(fā)庫來實(shí)現(xiàn)的: import java.util.concurrent.Executors;import java.util.concurrent.ExecutorService;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition; public class ThreadTest { private static Lock lock = new ReentrantLock();private static Condition subThreadCondition = lock.newCondition();private static boolean bBhouldSubThread = false;public static void main(String [] args){ ExecutorService threadPool = Executors.newFixedThreadPool(3);threadPool.execute(new Runnable(){ public void run(){ for(int i=0;i<50;i++){ lock.lock();try { if(!bBhouldSubThread)subThreadCondition.await();for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);} bBhouldSubThread = false;subThreadCondition.signal();}catch(Exception e){ } finally { lock.unlock();} } } });threadPool.shutdown();for(int i=0;i<50;i++){ lock.lock();try { if(bBhouldSubThread)subThreadCondition.await();for(int j=0;j<10;j++){ System.out.println(Thread.currentThread().getName()+ ”,j=“ + j);} bBhouldSubThread = true;subThreadCondition.signal();}catch(Exception e){ } finally { lock.unlock();} } } } 3、介紹Collection框架的結(jié)構(gòu) 答:隨意發(fā)揮題,天南海北誰便談,只要讓別覺得你知識淵博,理解透徹即可。 3、Collection框架中實(shí)現(xiàn)比較要實(shí)現(xiàn)什么接口 comparable/comparator 3、ArrayList和Vector的區(qū)別 答: 這兩個(gè)類都實(shí)現(xiàn)了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲在這兩個(gè)集合中的元素的位置都是有順序的,相當(dāng)于一種動(dòng)態(tài)的數(shù)組,我們以后可以按位置索引號取出某個(gè)元素,并且其中的數(shù)據(jù)是允許重復(fù)的,這是HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重復(fù)的元素(本來題目問的與hashset沒有任何關(guān)系,但為了說清楚ArrayList與Vector的功能,我們使用對比方式,更有利于說明問題)。 接著才說ArrayList與Vector的區(qū)別,這主要包括兩個(gè)方面:.(1)同步性: Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個(gè)線程會訪問到集合,那最好是使用ArrayList,因?yàn)樗豢紤]線程安全,效率會高些;如果有多個(gè)線程會訪問到集合,那最好是使用Vector,因?yàn)椴恍枰覀冏约涸偃タ紤]和編寫線程安全的代碼。 備注:對于Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時(shí)才提供的,它們是線程不安全的。所以,我們講課時(shí)先講老的。(2)數(shù)據(jù)增長: ArrayList與Vector都有一個(gè)初始的容量大小,當(dāng)存儲進(jìn)它們里面的元素的個(gè)數(shù)超過了容量時(shí),就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時(shí),不是只增加一個(gè)存儲單元,而是增加多個(gè)存儲單元,每次增加的存儲單元的個(gè)數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。Vector默認(rèn)增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長的空間大小,而ArrayList沒有提供設(shè)置增長空間的方法??偨Y(jié):即Vector增長原來的一倍,ArrayList增加原來的0.5倍。 4、HashMap和Hashtable的區(qū)別 (條理上還需要整理,也是先說相同點(diǎn),再說不同點(diǎn))HashMap是Hashtable的輕量級實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,在只有一個(gè)線程訪問的情況下,效率要高于Hashtable。 HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一 個(gè)實(shí)現(xiàn)。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。 就HashMap與HashTable主要從三方面來說。 一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn) 二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 三.值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value 5、List 和 Map 區(qū)別? 一個(gè)是存儲單列數(shù)據(jù)的集合,另一個(gè)是存儲鍵和值這樣的雙列數(shù)據(jù)的集合,List中存儲的數(shù)據(jù)是有順序,并且允許重復(fù);Map中存儲的數(shù)據(jù)是沒有順序的,其鍵是不能重復(fù)的,它的值是可以有重復(fù)的。 35、List, Set, Map是否繼承自Collection接口? List,Set是,Map不是 109、List、Map、Set三個(gè)接口,存取元素時(shí),各有什么特點(diǎn)? 這樣的題屬于隨意發(fā)揮題:這樣的題比較考水平,兩個(gè)方面的水平:一是要真正明白這些內(nèi)容,二是要有較強(qiáng)的總結(jié)和表述能力。如果你明白,但表述不清楚,在別人那里則等同于不明白。 首先,List與Set具有相似性,它們都是單列元素的集合,所以,它們有一個(gè)功共同的父接口,叫Collection。Set里面不允許有重復(fù)的元素,所謂重復(fù),即不能有兩個(gè)相等(注意,不是僅僅是相同)的對象,即假設(shè)Set集合中有了一個(gè)A對象,現(xiàn)在我要向Set集合再存入一個(gè)B對象,但B對象與A對象equals相等,則B對象存儲不進(jìn)去,所以,Set集合的add方法有一個(gè)boolean的返回值,當(dāng)集合中沒有某個(gè)元素,此時(shí)add方法可成功加入該元素時(shí),則返回true,當(dāng)集合含有與某個(gè)元素equals相等的元素時(shí),此時(shí)add方法無法加入該元素,返回結(jié)果為false。Set取元素時(shí),沒法說取 index,Obj e)方法,就可以指定當(dāng)前對象在集合中的存放位置。一個(gè)對象可以被反復(fù)存儲進(jìn)List中,每調(diào)用一次add方法,這個(gè)對象就被插入進(jìn)集合中一次,其實(shí),并不是把這個(gè)對象本身存儲進(jìn)了集合中,而是在集合中用一個(gè)索引變量指向這個(gè)對象,當(dāng)這個(gè)對象被add多次時(shí),即相當(dāng)于集合中有多個(gè)索引指向了這個(gè)對象,如圖x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍歷各個(gè)元素之外,還可以調(diào)用get(index i)來明確說明取 4、去掉一個(gè)Vector集合中重復(fù)的元素 Vector newVector = new Vector();For(int i=0;i 9、Collection 和 Collections的區(qū)別。 Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.Collections是針對集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序、線程安全化等操作。 39、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別? Set里的元素是不能重復(fù)的,元素重復(fù)與否是使用equals()方法進(jìn)行判斷的。equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對象的內(nèi)容和類型相配的話,返回真值。 53、你所知道的集合類都有哪些?主要方法? 最常用的集合類是 List 和 Map。List 的具體實(shí)現(xiàn)包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲和操作任何類型對象的元素列表。List 適用于按數(shù)值索引訪問元素的情形。 Map 提供了一個(gè)更通用的元素存儲方法。Map 集合類用于存儲元素對(稱作”鍵“和”值“),其中每個(gè)鍵映射到一個(gè)值。 ArrayList/Vector?List ?Collection HashSet/TreeSet?Set Propeties?HashTable ?Map Treemap/HashMap 我記的不是方法名,而是思想,我知道它們都有增刪改查的方法,但這些方法的 具體名稱,我記得不是很清楚,對于set,大概的方法是add,remove, contains;對于map,大概的方法就是put,remove,contains等,因?yàn)?,我只要在eclispe下按點(diǎn)操作符,很自然的這些方法就出來了。我記住的一些思想就是List類會有g(shù)et(int index)這樣的方法,因?yàn)樗梢园错樞蛉≡?,而set類中沒有g(shù)et(int index)這樣的方法。List和set都可以迭代出所有元素,迭代時(shí)先要得到一個(gè)iterator對象,所以,set和list類都有一個(gè)iterator方法,用于返回那個(gè)iterator對象。map可以返回三個(gè)集合,一個(gè)是返回所有的key的集合,另外一個(gè)返回的是所有value的集合,再一個(gè)返回的key和value組合成的EntrySet對象的集合,map也有g(shù)et方法,參數(shù)是key,返回值是key對應(yīng)的value。 45、兩個(gè)對象值相同(x.equals(y)== true),但卻可有不同的hash code,這句話對不對? 對。 如果對象要保存在HashSet或HashMap中,它們的equals相等,那么,它們的hashcode值就必須相等。 如果不是要保存在HashSet或HashMap,則與hashcode沒有什么關(guān)系了,這時(shí)候hashcode不等是可以的,例如arrayList存儲的對象就不用實(shí)現(xiàn)hashcode,當(dāng)然,我們沒有理由不實(shí)現(xiàn),通常都會去實(shí)現(xiàn)的。 46、TreeSet里面放對象,如果同時(shí)放入了父類和子類的實(shí)例對象,那比較時(shí)使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常! (應(yīng)該是沒有針對問題的確切的答案,當(dāng)前的add方法放入的是哪個(gè)對象,就調(diào)用哪個(gè)對象的compareTo方法,至于這個(gè)compareTo方法怎么做,就看當(dāng)前這個(gè)對象的類中是如何編寫這個(gè)方法的)實(shí)驗(yàn)代碼: public class Parent implements Comparable { private int age = 0;public Parent(int age){ this.age = age;} public int compareTo(Object o){ // TODO Auto-generated method stub System.out.println(”method of parent“);Parent o1 =(Parent)o;return age>o1.age?1:age } public class Child extends Parent { public Child(){ super(3);} public int compareTo(Object o){ // TODO Auto-generated method stub System.out.println(”method of child“);// Child o1 =(Child)o;return 1;} } public class TreeSetTest { /** * @param args */ public static void main(String[] args){ // TODO Auto-generated method stub TreeSet set = new TreeSet();set.add(new Parent(3));set.add(new Child());set.add(new Parent(4));System.out.println(set.size());} } 112、說出一些常用的類,包,接口,請各舉5個(gè) 要讓人家感覺你對java ee開發(fā)很熟,所以,不能僅僅只列core java中的那些東西,要多列你在做ssh項(xiàng)目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。 常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date,System,Class,List,HashMap 常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate 常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession 100、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類? 字節(jié)流,字符流。字節(jié)流繼承于InputStream OutputStream,字符流繼承于InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。102、字節(jié)流與字符流的區(qū)別 要把一片二進(jìn)制數(shù)據(jù)數(shù)據(jù)逐一輸出到某個(gè)設(shè)備中,或者從某個(gè)設(shè)備中逐一讀取一片二進(jìn)制數(shù)據(jù),不管輸入輸出設(shè)備是什么,我們要用統(tǒng)一的方式來完成這些操作,用一種抽象的方式進(jìn)行描述,這個(gè)抽象描述方式起名為IO流,對應(yīng)的抽象類為OutputStream和InputStream,不同的實(shí)現(xiàn)類就代表不同的輸入和輸出設(shè)備,它們都是針對字節(jié)進(jìn)行操作的。 在應(yīng)用中,經(jīng)常要完全是字符的一段文本輸出去或讀進(jìn)來,用字節(jié)流可以嗎?計(jì)算機(jī)中的一切最終都是二進(jìn)制的字節(jié)形式存在。對于“中國”這些字符,首先要得到其對應(yīng)的字節(jié),然后將字節(jié)寫入到輸出流。讀取時(shí),首先讀到的是字節(jié),可是我們要把它顯示為字符,我們需要將字節(jié)轉(zhuǎn)換成字符。由于這樣的需求很廣泛,人家專門提供了字符流的包裝類。 底層設(shè)備永遠(yuǎn)只接受字節(jié)數(shù)據(jù),有時(shí)候要寫字符串到底層設(shè)備,需要將字符串轉(zhuǎn)成字節(jié)再進(jìn)行寫入。字符流是字節(jié)流的包裝,字符流則是直接接受字符串,它內(nèi)部將串轉(zhuǎn)成字節(jié),再寫入底層設(shè)備,這為我們向IO設(shè)別寫入或讀取字符串提供了一點(diǎn)點(diǎn)方便。 字符向字節(jié)轉(zhuǎn)換時(shí),要注意編碼的問題,因?yàn)樽址D(zhuǎn)成字節(jié)數(shù)組,其實(shí)是轉(zhuǎn)成該字符的某種編碼的字節(jié)形式,讀取也是反之的道理。 講解字節(jié)流與字符流關(guān)系的代碼案例: import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.InputStreamReader; import java.io.PrintWriter; public class IOTest { public static void main(String[] args)throws Exception { String str = ”中國人“;/*FileOutputStream fos = new FileOutputStream(”1.txt“); fos.write(str.getBytes(”UTF-8“));fos.close();*/ /*FileWriter fw = new FileWriter(”1.txt“);fw.write(str);fw.close();*/ PrintWriter pw = new PrintWriter(”1.txt“,”utf-8“);pw.write(str);pw.close(); /*FileReader fr = new FileReader(”1.txt“);char[] buf = new char[1024];int len = fr.read(buf);String myStr = new String(buf,0,len);System.out.println(myStr);*/ /*FileInputStream fr = new FileInputStream(”1.txt“);byte[] buf = new byte[1024];int len = fr.read(buf);String myStr = new String(buf,0,len,”UTF-8“);System.out.println(myStr);*/ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(”1.txt“),”UTF-8"));String myStr = br.readLine();br.close();System.out.println(myStr);} } 105、什么是java序列化,如何實(shí)現(xiàn)java序列化?或者請解釋Serializable接口的作用。 技術(shù)培訓(xùn)就業(yè)合同書 (JAVA后臺程序) 甲方:(學(xué)生姓名) 乙方:北京龍吟榜藝術(shù)設(shè)計(jì)有限公司 根據(jù)中華人民共和國相關(guān)法律法規(guī),甲方委托乙方進(jìn)行技術(shù)就業(yè)培訓(xùn),經(jīng)雙方協(xié)商一致,達(dá)成如下協(xié)議: 一、甲方遵守乙方的相關(guān)規(guī)章制度,認(rèn)真配合乙方的實(shí)習(xí)教學(xué)工作,按時(shí)上課,不無故缺席。乙方信守承諾,提供安全衛(wèi)生的學(xué)習(xí)場所、合格的師資以及相應(yīng)的設(shè)備,保證培訓(xùn)質(zhì)量以及乙方的穩(wěn)定就業(yè)。 二、培訓(xùn)內(nèi)容 1.Java語言理解程序邏輯 2.使用JSP開發(fā)Web應(yīng)用系統(tǒng) 3.基于JSP Servlet JavaBean的網(wǎng)上交易系統(tǒng) 4.基于Struts Spring Hibernate Ajax的網(wǎng)上信息發(fā)布平臺 數(shù)據(jù)庫部分 1.使用SQLSERVER管理和查詢數(shù)據(jù) 2.第二階段:數(shù)據(jù)設(shè)計(jì)和高級編程 三、通過培訓(xùn)實(shí)習(xí),具備以下基本專業(yè)技能 1.通過網(wǎng)上動(dòng)態(tài)網(wǎng)站的實(shí)際案例,使學(xué)員能夠掌握J(rèn)DBC技術(shù)操作數(shù)據(jù)庫,在JAVA平臺下,開發(fā)大型網(wǎng)站或B/S軟件,使用SSH框架進(jìn)行大型項(xiàng)目的團(tuán)隊(duì)開發(fā)。最終使學(xué)員掌握基于JAVA技術(shù)平臺的B/S架構(gòu)開發(fā)。 四、推薦就業(yè):推薦對口專業(yè)工作,保證穩(wěn)定就業(yè),不限制推薦次數(shù),穩(wěn)定就業(yè)為止。 五、培訓(xùn)期限:自合同簽定之日起至達(dá)到就業(yè)水平。 六、培訓(xùn)質(zhì)量:保證甲方所學(xué)技能,達(dá)到獨(dú)立開發(fā)一般網(wǎng)站并能獨(dú)立工作的目的。 七、合同限期:自合同簽定之日起至就業(yè)。 八、費(fèi)用:。 九、備注:。 十、本合同一式兩份,甲乙雙方各執(zhí)一份,雙方簽字(蓋章)生效,未盡事宜,協(xié)商解決,協(xié)商未果的,可向人民法院提請?jiān)V訟,通過法律程序解決 甲方:(簽字)乙方:北京龍吟榜藝術(shù)設(shè)計(jì)有限公司(蓋章) 年月日乙方代表(簽字): 年月日 字[ 關(guān)于大學(xué)畢業(yè)生就業(yè)見習(xí)基地的報(bào)告 **縣人事與社會保障局暨財(cái)政局: 因我辦業(yè)務(wù)工作量不斷加大,現(xiàn)業(yè)務(wù)人員嚴(yán)重不足,工作任務(wù)重人員缺少,致使我單位工作無法正常開展,現(xiàn)申請就業(yè)見習(xí)基地為盼。若經(jīng)行政部門審核確定為畢業(yè)生就業(yè)見習(xí)基地,我們承諾將切實(shí)履行以下職責(zé): 1、遵守勞動(dòng)法等相關(guān)法律法規(guī); 2、明確見習(xí)崗位和職責(zé)、工作任務(wù)、考核量化標(biāo)準(zhǔn); 3、根據(jù)崗位要求選擇畢業(yè)生,并與服務(wù)中心和見習(xí)畢業(yè)生簽訂見習(xí)協(xié)議; 4、組織見習(xí)畢業(yè)生進(jìn)行單位規(guī)章制度、崗位操作規(guī)程、安全生產(chǎn)常識等崗前培訓(xùn); 5、將見習(xí)畢業(yè)生納入正式員工管理,提供工作條件,在技能培訓(xùn)、評先評優(yōu)等方面一視同仁,關(guān)心見習(xí)畢業(yè)生的成長進(jìn)步; 6、加強(qiáng)見習(xí)畢業(yè)生日常管理,定期向服務(wù)中心提供見習(xí)畢業(yè)生工作表現(xiàn)情況,及時(shí)反映畢業(yè)生見習(xí)期間的進(jìn)步和過失,為見習(xí)畢業(yè)生考核、期滿鑒定提供依據(jù); 7、積極為見習(xí)畢業(yè)生就業(yè)創(chuàng)造條件,見習(xí)期間我單位和見習(xí)畢業(yè)生達(dá)成就業(yè)意向的,可適時(shí)簽訂勞動(dòng)合同,建立正式用工關(guān)系。 以下是我單位的基本情況和提供崗位內(nèi)容,敬請批準(zhǔn)為感。 (公章)二〇年月日第四篇:JAVA就業(yè)合同
第五篇:就業(yè)基地申請報(bào)告