(Java)程序員面試-9_第1頁(yè)
(Java)程序員面試-9_第2頁(yè)
(Java)程序員面試-9_第3頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、(Java) 程序員面試 -9( 總分: 100.00 ,做題時(shí)間: 90 分鐘 )一、 論述題 ( 總題數(shù): 25,分?jǐn)?shù): 100.00)1. Java 語(yǔ)言有哪優(yōu)點(diǎn)(分?jǐn)?shù): 4.00 ) 正確答案: ()解析:Sun Microsystems 公司對(duì) Java 語(yǔ)言的描述如下:“Java is a simple, object -oriented, distributed, interpreted, robust, secure, architecture neutral, portable, high-performance, multithreaded,and dynamic lang

2、uage ”。具體而言, Java 語(yǔ)言具有以下幾個(gè)方面的優(yōu)點(diǎn):1)Java 為純面向?qū)ο蟮恼Z(yǔ)言。 Java 編程思想 提到 Java 語(yǔ)言是一種“ Everything is object ”的語(yǔ)言, 它能夠直接反應(yīng)現(xiàn)實(shí)生活中的對(duì)象,例如火車、動(dòng)物等,因此通過它,開發(fā)人員編寫程序更為容易。2)平臺(tái)無(wú)關(guān)性。Java語(yǔ)言可以“一次編譯,到處運(yùn)行"。無(wú)論是在windows平臺(tái)還是在Linux、MacOS等其他平臺(tái)上對(duì) Java 程序進(jìn)行編譯,編譯后的程序在其他平臺(tái)上都可以運(yùn)行。由于 Java 為解釋型語(yǔ)言,編 譯器會(huì)把 Java 代碼變成“中間代碼”,然后在 Java 虛擬機(jī) (Java

3、virtual Machine, JVM) 上解釋執(zhí)行。由 于中間代碼與平臺(tái)無(wú)關(guān),因此, Java 語(yǔ)言可以很好地跨平臺(tái)執(zhí)行,具有很好的可移植性。3)Java 提供了很多內(nèi)置的類庫(kù),通過這些類庫(kù),簡(jiǎn)化了開發(fā)人員的程序設(shè)計(jì)工作,同時(shí)縮短了項(xiàng)目的開發(fā) 時(shí)間,例如, Java 語(yǔ)言提供了對(duì)多線程的支持, 提供了對(duì)網(wǎng)絡(luò)通信的支持, 最重要的是提供了垃圾回收器, 這使得開發(fā)人員從對(duì)內(nèi)存的管理中解脫出來(lái)。4)提供了對(duì) Web應(yīng)用開發(fā)的支持,例如, Applet、Servlet和JSP可以用來(lái)開發(fā) Web應(yīng)用程序;Socket、 RMI可以用來(lái)開發(fā)分布式應(yīng)用程序的類庫(kù)。5)具有較好的安全性和健壯性。Java

4、 語(yǔ)言經(jīng)常被用在網(wǎng)絡(luò)環(huán)境中, 為了增強(qiáng)程序的安全性, Java 語(yǔ)言提供了一個(gè)防止惡意代碼攻擊的安全機(jī)制 (數(shù)組邊界檢測(cè)和 Bytecode 校驗(yàn)等 )。 Java 的強(qiáng)類型機(jī)制、垃圾回收 器、異常處理和安全檢查機(jī)制使得用 Java 語(yǔ)言編寫的程序有很好的健壯性。6)去除了 C+吾言中難以理解、容易混淆的特性,例如頭文件、指針、結(jié)構(gòu)、單元、運(yùn)算符重載、虛擬基 礎(chǔ)類、多重繼承等,使得程序更加嚴(yán)謹(jǐn)、簡(jiǎn)潔。常見筆試題:Java 語(yǔ)言是由 語(yǔ)言改進(jìn)并重新設(shè)計(jì)而來(lái)的。AAda BC+ CPascal D BASIC答案:B。Ada語(yǔ)言是美國(guó)軍方為了整合不同語(yǔ)言開發(fā)的系統(tǒng)而發(fā)明的一種語(yǔ)言,其最大的特點(diǎn)是實(shí)

5、時(shí)性,在Ada95中已加入面向?qū)ο髢?nèi)容。Pascal語(yǔ)言是為提倡結(jié)構(gòu)化編程而發(fā)明的語(yǔ)言。BASIC語(yǔ)言為了讓大學(xué)生容易地控制計(jì)算機(jī)開發(fā)的語(yǔ)言,其特點(diǎn)是簡(jiǎn)單易懂,且可以用解釋和編譯兩種方法執(zhí)行。C+吾言是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言,它支持過程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向 對(duì)象程序設(shè)計(jì)、泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。 Java 語(yǔ)言是一種面向?qū)ο笳Z(yǔ)言,從語(yǔ)法結(jié)構(gòu)上看,與 C+類似。2. Java與C/C+有什么異同(分?jǐn)?shù): 4.00 ) 正確答案: ()解析:Java與C+都是面向?qū)ο笳Z(yǔ)言,都使用了面向?qū)ο笏枷耄ɡ绶庋b、繼承、多態(tài)等),由于面向?qū)ο笥性S多非常好的特

6、性 (繼承、組合等 ),因此二者都有很好的可重用性。需要注意的是,二者并非完全一樣,下面主要介紹它們的不同點(diǎn):1). Java為解釋性語(yǔ)言,其運(yùn)行過程為:程序源代碼經(jīng)過Java編譯器編譯成字節(jié)碼,然后由 JVM解釋執(zhí)行。而C/C+為編譯型語(yǔ)言,源代碼經(jīng)過編譯和鏈接后生成可執(zhí)行的二進(jìn)制代碼。因此,Java的執(zhí)行速度比C/C+慢,但是Java能夠跨平臺(tái)執(zhí)行,而 C/C+不能。2) Java 為純面向?qū)ο笳Z(yǔ)言, 所有代碼 (包括函數(shù)、變量等)必須在類中實(shí)現(xiàn), 除基本數(shù)據(jù)類型 (包括 int 、float 等)外,所有類型都是類。此外,Java語(yǔ)言中不存在全局變量或全局函數(shù),而C+兼具面向過程和面向過

7、程編程的特點(diǎn),可以定義全局變量和全局函數(shù)。3) 與C/C+語(yǔ)言相比,Java語(yǔ)言中沒有指針的概念,這有效防止了C/C+語(yǔ)言中操作指針可能引起的系統(tǒng)問題,從而使程序變得更加安全。4) 與C+語(yǔ)言相比,Java語(yǔ)言不支持多重繼承,但是Java語(yǔ)言引入了接口的概念,可以同時(shí)實(shí)現(xiàn)多個(gè)接口。由于接口也具有多態(tài)特性,因此在Java語(yǔ)言中可以通過實(shí)現(xiàn)多個(gè)接口來(lái)實(shí)現(xiàn)與C+語(yǔ)言中多重繼承類似的目的。5) 在C+語(yǔ)言中,需要開發(fā)人員去管理對(duì)內(nèi)存的分配(包括申請(qǐng)與釋放),而Java語(yǔ)言提供了垃圾回收器來(lái)實(shí)現(xiàn)垃圾的自動(dòng)回收,不需要程序顯式地管理內(nèi)存的分配。在C+語(yǔ)言中,通常都會(huì)把釋放資源的代碼放到析構(gòu)函數(shù)中, Jav

8、a 語(yǔ)言中雖然沒有析構(gòu)函數(shù), 但卻引入了一個(gè) finalize() 方法, 當(dāng)垃圾回收器將要釋放 無(wú)用對(duì)象的內(nèi)存時(shí),會(huì)首先調(diào)用該對(duì)象的 finalize() 方法,因此,開發(fā)人員不需要關(guān)心也不需要知道對(duì)象 所占的內(nèi)存空間何時(shí)會(huì)被釋放。C+語(yǔ)言支持運(yùn)算符重載,而 Java語(yǔ)言不支持運(yùn)算符重載。C+語(yǔ)言支持預(yù)處理,而 Java語(yǔ)言沒有預(yù)處理器,雖然不支持預(yù)處理功能(包括頭文件、宏定義等),但它提供的import機(jī)制與C+中的預(yù)處理器功能類 似。C+支持默認(rèn)函數(shù)參數(shù),而 Java不支持默認(rèn)函數(shù)參數(shù)。C/C+支持goto語(yǔ)句,而Java不提供goto語(yǔ)句(但Java中g(shù)oto是保留關(guān)鍵字)。C/C+支

9、持自動(dòng)強(qiáng)制類型轉(zhuǎn)換,這會(huì)導(dǎo)致程序的不安全;而 Java不支 持自動(dòng)強(qiáng)制類型轉(zhuǎn)換,必須由開發(fā)人員進(jìn)行顯式地強(qiáng)制類型轉(zhuǎn)換。C/C+中,結(jié)構(gòu)和聯(lián)合的所有成員均為公有,這往往會(huì)導(dǎo)致安全性問題的發(fā)生,而 Java 根本就不包含結(jié)構(gòu)和聯(lián)合,所有內(nèi)容都封裝在類里面。Java具有平臺(tái)無(wú)關(guān)性,即對(duì)每種數(shù)據(jù)類型都分配固定長(zhǎng)度,例如,int類型總是占據(jù)32位,而C/C+卻不然,同一個(gè)數(shù)據(jù)類型在不同的平臺(tái)上會(huì)分配不同的字節(jié)數(shù)。Java 提供對(duì)注釋文檔的內(nèi)建支持,所以源碼文件也可以包含它們自己的文檔。通過一個(gè)單獨(dú)的程序,這些 文檔信息可以提取出來(lái),并重新格式化成HTML。Java 包含了一些標(biāo)準(zhǔn)庫(kù), 用于完成特定的任務(wù)

10、, 同時(shí)這些庫(kù)簡(jiǎn)單易用, 能夠大大縮短開發(fā)周期, 例如, Java 提供了用于訪問數(shù)據(jù)庫(kù)的 JDBC庫(kù),用于實(shí)現(xiàn)分布式對(duì)象的RMI等標(biāo)準(zhǔn)庫(kù)。C+則依靠一些非標(biāo)準(zhǔn)的、由其他廠商提供的庫(kù)。常見筆試題: 下列說法中,錯(cuò)誤的有 。AJava 面向?qū)ο笳Z(yǔ)言容許單獨(dú)的過程與函數(shù)存在BJava 面向?qū)ο笳Z(yǔ)言容許單獨(dú)的方法存在CJava 語(yǔ)言中的方法屬于類中的成員(member)DJava 語(yǔ)言中的方法必定隸屬于某一類(對(duì)象),調(diào)用方法與過程或函數(shù)相同答案:A、B、C。見上面講解。3. 為什么需要 public static void main (Stringargs)這個(gè)方法(分?jǐn)?shù): 4.00 ) 正確答案

11、: ()解析:public static void main (Stringargs)為Java程序的入口方法,JVM在運(yùn)行程序時(shí),會(huì)首先查找 main() 方法。 其中, public 是權(quán)限修飾符, 表明任何類或?qū)ο蠖伎梢栽L問這個(gè)方法, static 表明 main() 方法是一個(gè)靜態(tài)方法,即方法中的代碼是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)的,只要類被加載后,就可以使用該方法而不 需要通過實(shí)例化對(duì)象來(lái)訪問,可以直接通過類名.main()直接訪問,JVM在啟動(dòng)時(shí)就是按照上述方法的簽名(必須有public與static 修飾,返回值為void,且方法的參數(shù)為字符串?dāng)?shù)組)來(lái)查找方法的入口地址,若能找到,就執(zhí)行;找

12、不到,則會(huì)報(bào)錯(cuò)。void表明方法沒有返回值,main是JVM識(shí)別的特殊方法名,是程序的入口方法。字符串?dāng)?shù)組參數(shù) args 為開發(fā)人員在命令行狀態(tài)下與程序交互提供了一種手段。因?yàn)?main 是程序的入口方法,所以當(dāng)程序運(yùn)行時(shí),第一個(gè)執(zhí)行的方法就是main() 方法。通常來(lái)講,要執(zhí)行一個(gè)類的方法, 先必須實(shí)例化一個(gè)類的對(duì)象, 然后通過對(duì)象來(lái)調(diào)用這個(gè)方法。 但由于 main 是程序的入口 方法,此時(shí)還沒有實(shí)例化對(duì)象,因此在編寫 main() 方法時(shí)就要求不需要實(shí)例化對(duì)象就可以調(diào)用這個(gè)方法, 鑒于此, main() 方法需要被定義成 public 與 static 。下例給出了在調(diào)用 main() 方

13、法時(shí)傳遞參數(shù)的方法。public class Testpublic static void main(Stringargs)for(int i=0; i < args. length ; i+);在控制臺(tái)下,使用 javac Test java 指令編譯上述程序,使用 java Test arg1 arg2 arg3 指令運(yùn)行程序, 程序運(yùn)行結(jié)果為:arg1arg2arg3引申:1main() 方法是否還有其他可用的定義格式 ?1) 由于 public 與 static 沒有先后順序關(guān)系,因此下面的定義也是合理的。static public void main (Stringargs)2

14、) 也可以把 main() 方法定義為 final 。public static final void main (String args)3) 也可以用 synchronized 來(lái)修飾 main() 方法。static public synchronized void main (Stringargs)不管哪種定義方式,都必須保證 main() 方法的返回值為 void ,并有 static 與 public 關(guān)鍵字修飾。同時(shí)由 于 main() 方法為程序的入口方法,因此不能用 abstract 關(guān)鍵字來(lái)修飾。2同一個(gè) java 文件中是否可以有多個(gè) main() 方法?雖然每個(gè)類中都可

15、以定義 main() 方法,但是只有與文件名相同的用 public 修飾的類中的 main() 方法才能 作為整個(gè)程序的入口方法。如下例所示,創(chuàng)建了一個(gè)名為 Test.java 的文件。class Tpublic static void main(Stringargs)public class Test/ 程序入口函數(shù)public static void main(Stringargs)程序運(yùn)行結(jié)果為:Test main常見筆試題:Java 程序中程序運(yùn)行入口方法 main 的簽名正確的有 。A publ ic static void main (Stringargs)B publ ic st

16、atic final void main (Stringargs)Cstatic public void main (Stringargs)Dstatic public synchronized void main (Stringargs)Estatic public abstract void main (Stringargs)答案:A、B、C、D。見上面講解。4. 如何實(shí)現(xiàn)在 main()方法執(zhí)行前輸出“ Hello World ”分?jǐn)?shù): 4.00 ) 正確答案: ()解析: 眾所周知, 在 Java 語(yǔ)言中, main() 方法是程序的入口方法, 在程序運(yùn)行時(shí), 最先加載的就是 main

17、() 方法,但這是否意味著 main() 方法就是程序運(yùn)行時(shí)第一個(gè)被執(zhí)行的模塊呢 ?答案是否定的。在 Java 語(yǔ)言中,由于靜態(tài)塊在類被加載時(shí)就會(huì)被調(diào)用,因此可以在 main() 方法執(zhí)行前, 利用靜態(tài)塊實(shí)現(xiàn)輸出“ Hello World ”的功能,以如下代碼為例。public class Test staticpublic static void main(String args) 程序運(yùn)行結(jié)果為:Hello World1Hello World2由于靜態(tài)塊不管順序如何,都會(huì)在 main() 方法執(zhí)行之前執(zhí)行,因此,以下代碼會(huì)與上面的代碼有同樣的輸 出結(jié)果。public class Test

18、public static void main(String args) static ”);5. Java 程序初始化的順序是怎樣的(分?jǐn)?shù): 4.00 ) 正確答案: ()解析:在 Java 語(yǔ)言中,當(dāng)實(shí)例化對(duì)象時(shí),對(duì)象所在類的所有成員變量首先要進(jìn)行初始化,只有當(dāng)所有類成 員完成初始化后,才會(huì)調(diào)用對(duì)象所在類的構(gòu)造函數(shù)創(chuàng)建對(duì)象。Java程序的初始化一般遵循3個(gè)原則(優(yōu)先級(jí)依次遞減):靜態(tài)對(duì)象(變量)優(yōu)先于非靜態(tài)對(duì)象(變量)初始化,其中,靜態(tài)對(duì)象(變量)只初始化一次,而非靜態(tài)對(duì)象(變量)可能會(huì)初始化多次。父類優(yōu)先于子類進(jìn) 行初始化。按照成員變量的定義順序進(jìn)行初始化。即使變量定義散布于方法定義之中

19、,它們依然在任何 方法(包括構(gòu)造函數(shù) )被調(diào)用之前先初始化。Java 程序初始化工作可以在許多不同的代碼塊中來(lái)完成 ( 例如靜態(tài)代碼塊、構(gòu)造函數(shù)等 ),它們執(zhí)行的順序 如下:父類靜態(tài)變量、父類靜態(tài)代碼塊、子類靜態(tài)變量、子類靜態(tài)代碼塊、父類非靜態(tài)變量、父類非靜態(tài) 代碼塊、父類構(gòu)造函數(shù)、子類非靜態(tài)變量、子類非靜態(tài)代碼塊、子類構(gòu)造函數(shù)。下面給出一個(gè)不同模塊初 始化時(shí)執(zhí)行順序的一個(gè)例子。class Basestaticpublic Base() public class Derived extends Base staticpublic Derived()System out println( ”De

20、rived constructor ”); public static void main(String args) new Derived() ; 程序運(yùn)行結(jié)果為: Base static block Derived static block Base blockBase constructorDerived blockDerived constructor 常見筆試題: 下面代碼的運(yùn)行結(jié)果是什么 ? class B extends Object static public B() static class A extends B static public A()public class

21、Testclass public static void main(Stringargs) new A();A Load B1 Load B2 Create B Load A Create A B Load B1 Load B2 Load A Create B Create A C Load B2 Load B1 Create B Create A Load A D Create B Create A Load B1 Load B2 Load A 答案:B。見上面講解。6. Java 中的作用域有哪分?jǐn)?shù): 4.00 )正確答案: () 解析:在計(jì)算機(jī)程序中,聲明在不同地方的變量具有不同的作用域

22、,例如局部變量、全局變量等。在Java語(yǔ)言中,作用域是由花括號(hào)的位置決定的,它決定了其定義的變量名的可見性與生命周期。在 Java 語(yǔ)言中,變量的類型主要有 3種:成員變量、靜態(tài)變量和局部變量。類的成員變量的作用范圍與類 的實(shí)例化對(duì)象的作用范圍相同,當(dāng)類被實(shí)例化時(shí),成員變量就會(huì)在內(nèi)存中分配空間并初始化,直到這個(gè)被 實(shí)例化對(duì)象的生命周期結(jié)束時(shí), 成員變量的生命周期才結(jié)束。 被 static 修飾的成員變量被稱為靜態(tài)變量或 全局變量,與成員變量不同的是,靜態(tài)變量不依賴于特定的實(shí)例,而是被所有實(shí)例所共享,也就是說,只 要一個(gè)類被加載,JVM就會(huì)給類的靜態(tài)變量分配存儲(chǔ)空間。因此,就可以通過類名和變量名

23、來(lái)訪問靜態(tài)變 量。局部變量的作用域與可見性為它所在的花括號(hào)內(nèi)。此外,成員變量也有 4 種作用域,它們的區(qū)別見下表。作用域的對(duì)比作用域與可見性當(dāng)前類同一 package子類其他 packagepublicVVVVprivateVXXXprotectedVVVXdefaultVVXX1) public 。表明該成員變量或方法對(duì)所有類或?qū)ο蠖际强梢姷模蓄惢驅(qū)ο蠖伎梢灾苯釉L問。2) private 。表明該成員變量或方法是私有的,只有當(dāng)前類對(duì)其具有訪問權(quán)限,除此之外的其他類或者對(duì)象都沒有訪問權(quán)限。3) protected 。表明成員變量或方法對(duì)該類自身, 與它在同一個(gè)包中的其它類,在其它包中的該類

24、的子類都可見。4)default 。表明該成員變量或方法只有自己和與其位于同一包內(nèi)的類可見。 若父類與子類位于同一個(gè)包內(nèi), 則子類對(duì)父類的 default 成員變量或方法都有訪問權(quán)限;若父類與子類位于不同的 package( 包)內(nèi),則沒 有訪問權(quán)限。需要注意的是,這些修飾符只能修飾成員變量,不能用來(lái)修飾局部變量。private 與 protected 不能用來(lái)修飾類 ( 只有 public 、abstract 或 final 常見筆試題:能用來(lái)修飾類 )。下列說法中,正確的是 A.實(shí)例方法可直接調(diào)用超類的實(shí)例方法 C.實(shí)例方法可直接調(diào)用其他類的實(shí)例方法 答案:D。當(dāng)超類的實(shí)例方法或類方法為

25、private 時(shí),也不能被直接調(diào)用。7.一個(gè) Java 文件中是否可以定義多個(gè)類B實(shí)例方法可直接調(diào)用超類的類方法D 實(shí)例方法可直接調(diào)用本類的類方法private 時(shí),是不能被子類調(diào)用的。同理,當(dāng)其他類的實(shí)例方法為分?jǐn)?shù): 4.00 ) 正確答案: ()解析:一個(gè) Java 文件中可以定義多個(gè)類,但是最多只能有一個(gè)類被 public 修飾,并且這個(gè)類的類名與文 件名必須相同,若這個(gè)文件中沒有 public 的類,則文件名隨便是一個(gè)類的名字即可。需要注意的是,當(dāng)用 javac 指令編譯這個(gè) .java 文件時(shí),它會(huì)給每一個(gè)類生成一個(gè)對(duì)應(yīng)的 .class 文件,如下例定義 Derived.jave

26、為: class Base public void print() public class Derived extends Base public static void main(Stringa) Base c=new Derived();c.print();使用 javac Derived.java 指令編譯上述代碼,會(huì)生成兩個(gè)字節(jié)碼文件: Base.class 與 Derived.class ,然 后使用 java Derived 指令執(zhí)行代碼,此時(shí),控制臺(tái)的輸出結(jié)果為:Base。8. 什么是構(gòu)造函數(shù)(分?jǐn)?shù): 4.00 ) 正確答案: () 解析:構(gòu)造函數(shù)是一種特殊的函數(shù),用來(lái)在對(duì)象實(shí)

27、例化時(shí)初始化對(duì)象的成員變量。在 Java 語(yǔ)言中,構(gòu)造函 數(shù)具有以下特點(diǎn)。1) 構(gòu)造函數(shù)必須與類的名字相同,并且不能有返回值( 返回值也不能為 void) 。2) 每個(gè)類可以有多個(gè)構(gòu)造函數(shù)。當(dāng)開發(fā)人員沒有提供構(gòu)造函數(shù)時(shí),編譯器在把源代碼編譯成字節(jié)碼的過程 中會(huì)提供一個(gè)沒有參數(shù)默認(rèn)的構(gòu)造函數(shù), 但該構(gòu)造函數(shù)不會(huì)執(zhí)行任何代碼。 如果開發(fā)人員提供了構(gòu)造函數(shù), 那么編譯器就不會(huì)再創(chuàng)建默認(rèn)的構(gòu)造函數(shù)了。3) 構(gòu)造函數(shù)可以有 0 個(gè)、1個(gè)或 1 個(gè)以上的參數(shù)。4) 構(gòu)造函數(shù)總是伴隨著 new操作一起調(diào)用,且不能由程序的編寫者直接調(diào)用,必須要由系統(tǒng)調(diào)用。構(gòu)造函 數(shù)在對(duì)象實(shí)例化時(shí)會(huì)被自動(dòng)調(diào)用,且只運(yùn)行一次;而

28、普通的方法是在程序執(zhí)行到它時(shí)被調(diào)用,且可以被該 對(duì)象調(diào)用多次。5) 構(gòu)造函數(shù)的主要作用是完成對(duì)象的初始化工作。6) 構(gòu)造函數(shù)不能被繼承,因此,它不能被覆蓋,但是構(gòu)造函數(shù)能夠被重載,可以使用不同的參數(shù)個(gè)數(shù)或參 數(shù)類型來(lái)定義多個(gè)構(gòu)造函數(shù)。7) 子類可以通過 super 關(guān)鍵字來(lái)顯式地調(diào)用父類的構(gòu)造函數(shù),當(dāng)父類沒有提供無(wú)參數(shù)的構(gòu)造函數(shù)時(shí),子類的構(gòu)造函數(shù)中必須顯式地調(diào)用父類的構(gòu)造函數(shù)。如果父類提供了無(wú)參數(shù)的構(gòu)造函數(shù),此時(shí)子類的構(gòu)造函數(shù) 就可以不顯式地調(diào)用父類的構(gòu)造函數(shù),在這種情況下編譯器會(huì)默認(rèn)調(diào)用父類提供的無(wú)參數(shù)的構(gòu)造函數(shù)。當(dāng) 有父類時(shí),在實(shí)例化對(duì)象時(shí)會(huì)先執(zhí)行父類的構(gòu)造函數(shù),然后執(zhí)行子類的構(gòu)造函數(shù)。8

29、) 當(dāng)父類和子類都沒有定義構(gòu)造函數(shù)時(shí),編譯器會(huì)為父類生成一個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),給子類也生 成一個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù)。 此外, 默認(rèn)構(gòu)造器的修飾符只跟當(dāng)前類的修飾符有關(guān) ( 例如,如果一個(gè)類 被定義為 public ,那么它的構(gòu)造函數(shù)也是 public) 。引申:普通方法是否可以與構(gòu)造函數(shù)有相同的方法名 ?可以,示例如下。public class Testpublic Test()public void Test()public static void main(Stringargs) Test a=new Test(); / 調(diào)用構(gòu)造函數(shù)a.Test(); / 調(diào)用 Test 方法程

30、序運(yùn)行結(jié)果為:constructcall Test 常見筆試題: 1下列關(guān)于構(gòu)造方法的敘述中,錯(cuò)誤的是 。A Java 語(yǔ)言規(guī)定構(gòu)造方法名與類名必須相同B Java 語(yǔ)言規(guī)定構(gòu)造方法沒有返回值,但不用void 聲明C Java 語(yǔ)言規(guī)定構(gòu)造方法不可以重載D. Java語(yǔ)言規(guī)定構(gòu)造方法只能通過new自動(dòng)調(diào)用答案:C。可以定義多個(gè)構(gòu)造函數(shù),只要不同的構(gòu)造函數(shù)有不同的參數(shù)即可。2.下列說法中,正確的是 。A. class 中的 constructor 不可省略B. constructor 必須與 class 同名,但方法不能與 class 同名C. constructor 在一個(gè)對(duì)象被 new時(shí)執(zhí)行

31、D. 個(gè) class 只能定義一個(gè) constructor答案:C。見上面講解。9. 為什么 Java 中有接口沒有任何方法(分?jǐn)?shù): 4.00 ) 正確答案: ()解析:由于 Java 不支持多重繼承,即一個(gè)類只能有一個(gè)父類,為了克服單繼承的缺點(diǎn),Java 語(yǔ)言引入了接口這一概念。接口是抽象方法定義的集合 (接口中也可以定義一些常量值 ) ,是一種特殊的抽象類。接口 中只包含方法的定義,沒有方法的實(shí)現(xiàn)。接口中的所有方法都是抽象的。接口中成員的作用域修飾符都是 public ,接口中的常量值默認(rèn)使用 public static final 修飾。由于一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,因此通常 可以采用實(shí)現(xiàn)

32、多個(gè)接口的方式來(lái)間接達(dá)到多重繼承的目的。在 Java 語(yǔ)言中,有些接口內(nèi)部沒有聲明任何方法,也就是說,實(shí)現(xiàn)這些接口的類不需要重寫任何方法,這 些沒有任何方法聲明的接口又被叫做標(biāo)識(shí)接口,標(biāo)識(shí)接口對(duì)實(shí)現(xiàn)它的類沒有任何語(yǔ)義上的要求,它僅僅充 當(dāng)一個(gè)標(biāo)識(shí)的作用,用來(lái)表明實(shí)現(xiàn)它的類屬于一個(gè)特定的類型。這個(gè)標(biāo)簽類似于汽車的標(biāo)志圖標(biāo),每當(dāng)人 們看到一個(gè)汽車的標(biāo)志圖標(biāo)時(shí),就能知道這款汽車的品牌。Java 類庫(kù)中已存在的標(biāo)識(shí)接口有 Cloneable 和Serializable 等。在使用時(shí)會(huì)經(jīng)常用 instanceof 來(lái)判斷實(shí)例對(duì)象的類型是否實(shí)現(xiàn)了一個(gè)給定的標(biāo)識(shí)接口。 下面通過一個(gè)例子來(lái)詳細(xì)說明標(biāo)識(shí)接口的作

33、用。例如要開發(fā)一款游戲,游戲里面有一個(gè)人物專門負(fù)責(zé)出去 尋找有用的材料, 假設(shè)這個(gè)人物只收集礦石和武器, 而不會(huì)收集垃圾。 下面通過標(biāo)識(shí)接口來(lái)實(shí)現(xiàn)這個(gè)功能。import Java. util. ArrayList;interface Stuff/ 礦石interface Ore extends Stuff/ 武器interface Weapon extends Stuff/ 垃圾interface Rubbish extends Stuff/ 金礦class Gold implements Orepublic String toString( )return "Gold"/

34、 銅礦class Copper implements Orepublic String toString( )return "Copper"/ 槍class Gun implements Weaponpublic String toString( )return "Gun"/ 榴彈class Grenade implements Weaponpublic String toString( )return "Grenade"class Stone implements Rubbish public String toString( )r

35、eturn "Stone"public class Test public static ArrayList < Stuff > collectStuff(Stuff s)ArrayList < Stuff > al= new ArrayList < Stuff > ();for(int i =0;i< s. length;i + ) if( ! (si instanceof Rubbish) )al. add(si);return al;public static void main(String args) Stuff s =

36、new Gold( ), new Copper( ), new Gun( ), new Grenade( ), new Stone( );ArrayList < Stuff > al=collectStuff(s);for(int i=0;i< al.size();i+)程序運(yùn)行結(jié)果為:The usefull Stuff collected is:GoldCopperGunGrenade在上例中,設(shè)計(jì)了 3個(gè)接口: Ore、Weapon和Rubbish分別代表礦石、武器和垃圾,只要是實(shí)現(xiàn)Ore或Weapon 的類,游戲中的角色都會(huì)認(rèn)為這是有用的材料,例如Gold、Copper

37、、Gun Grenade,因此會(huì)收集;只要是實(shí)現(xiàn) Rubbish 的類,都會(huì)被認(rèn)為是無(wú)用的東西,例如 Stone ,因此不會(huì)被收集。常見筆試題:不能用來(lái)修飾 interface 的有A private B public C protected D static答案:A、C D。見上面講解。10. Java 中的 clone 方法有什么作用分?jǐn)?shù): 4.00 )正確答案: () 解析:由于指針不僅會(huì)給開發(fā)人員帶來(lái)使用上的不便,而且也是造成程序不穩(wěn)定的根源,為了消除C/C+語(yǔ)言的這些缺點(diǎn), Java 語(yǔ)言取消了指針的概念, 但這只是在 Java 語(yǔ)言中沒有明確提供指針的概念與用法, 而實(shí)質(zhì)上每個(gè)ne

38、w語(yǔ)句返回的都是一個(gè)指針的引用,只不過在大部分情況下開發(fā)人員不需要關(guān)心如何去操 作這個(gè)指針而已。由于 Java 取消了指針的概念,因此開發(fā)人員在編程中往往忽略了對(duì)象和引用的區(qū)別,示例如下。class Objpublic void setStr(String str)this.str=str;private String str= "default value"public String toString()return str;public class TestRefprivate Obj aObj=new Obj();private int aInt=0;public O

39、bj getAObj()return aObj;public int gerAInt()return aInt;public void changeObj(Obj inObj) inObj.setStr("changed value");public void changeInt(int inInt)inInt=1;public static void main(Stringargs)TestRef oRef=new TestRef();System.out.println(II*引用類型*11);調(diào)用 changeObj() 前: "+oRef.getAObj(

40、);oRef.changeObj(oRef.getAObj();System.out.println(" 調(diào)用 changeObj() System.out.println("* System.out.println(" 調(diào)用 changeInt() oRef.changeInt(oRef.getAInt().System.out.println(" 程序運(yùn)行結(jié)果為:*后: "+oRer.getAObj(); 基本數(shù)據(jù)類型 *");前 : "+oRef.getAInt();調(diào)用 changeInt()后 : "+o

41、Ref.getAInt();調(diào)用 changeObj() 調(diào)用 changeObj()*調(diào)用 changeInt() 調(diào)用 changeInt()引用類型 *前 : default value后 : changed value基本數(shù)據(jù)類型 *前: 0后: 0上面兩個(gè)看似類似的方法卻有著不同的運(yùn)行結(jié)果, 主要原因是 Java 在處理基本數(shù)據(jù)類型 (例如 int 、char 、double 等) 時(shí),都是采用按值傳遞 (傳遞的是輸入?yún)?shù)的復(fù)制 ) 的方式執(zhí)行,除此之外的其他類型都是按引 用傳遞 ( 傳遞的是對(duì)象的一個(gè)引用 )的方式執(zhí)行。 對(duì)象除了在函數(shù)調(diào)用時(shí)是引用傳遞, 在使用“ =”賦值時(shí)也 采

42、用引用傳遞,示例代碼如下。Class Obj private int aInt=0;public int getAInt() return aInt;public void setAInt(int int1) aInt=int1;public void changeInt() this.aInt=1;public class TestRefpublic static void main(Stringargs)Obj a=new Obj();Obj b=a;b.changeInt();程序運(yùn)行結(jié)果為:a:1 b:1在實(shí)際編程中,經(jīng)常會(huì)遇到從某個(gè)已有的對(duì)象A創(chuàng)建出另外一個(gè)與 A具有相同狀態(tài)的對(duì)象

43、B,并且對(duì)B的修改不會(huì)影響到 A 的狀態(tài), 例如, Prototype( 原型)模式中, 就需要 clone 一個(gè)對(duì)象實(shí)例。 在 Java 語(yǔ)言中, 僅僅通過簡(jiǎn)單的賦值操作顯然無(wú)法達(dá)到這個(gè)目的,而 Java 提供了一個(gè)簡(jiǎn)單有效的 clone() 方法來(lái)滿足這個(gè) 需求。Java 中的所有類默認(rèn)都繼承自 Object 類,而 Object 類中提供了一個(gè) clone() 方法。這個(gè)方法的作用是返 回一個(gè) Object 對(duì)象的復(fù)制。 這個(gè)復(fù)制函數(shù)返回的是一個(gè)新的對(duì)象而不是一個(gè)引用。 那么怎樣使用這個(gè)方法 呢 ? 以下是使用 clone() 方法的步驟。1) 實(shí)現(xiàn) clone 的類首先需要繼承 Clo

44、neable 接口。 Cloneable 接口實(shí)質(zhì)上是一個(gè)標(biāo)識(shí)接口,沒有任何接口 方法。2) 在類中重寫 Object 類中的 clone() 方法。3) 在 clone 方法中調(diào)用 super.clone() 。無(wú)論 clone 類的繼承結(jié)構(gòu)是什么, super.clone() 都會(huì)直接或間接 調(diào)用 類的 clone() 方法。4) 把淺復(fù)制的引用指向原型對(duì)象新的克隆體。對(duì)上面的例子引入 clone 方法如下:class Obj implements Cloneableprivate int aInt=0;public int getAInt()return aInt;public void

45、 setAInt(int int1)aInt=int1;public void changeInt()this.aInt=1;public Object clone()Object o=null;tryo=(Obj)super.clone(); catch (CloneNotsupportedException e) e.printStackTrace();return o;public class TestRefpublic static void main(Stringargs)Obj a=new Obj();Obj b=(Obj)a.clone();b.changeInt();程序運(yùn)行結(jié)

46、果為:a:0b:1在C+語(yǔ)言中,當(dāng)開發(fā)人員自定義復(fù)制構(gòu)造函數(shù)時(shí),會(huì)存在淺復(fù)制與深復(fù)制之分。Java語(yǔ)言在重載clone()方法時(shí)也存在同樣的問題,當(dāng)類中只有一些基本的數(shù)據(jù)類型時(shí),采用上述方法就可以了,但是當(dāng)類中包含 了一些對(duì)象時(shí),就需要用到深復(fù)制了,實(shí)現(xiàn)方法是在對(duì)對(duì)象調(diào)用 clone() 方法完成復(fù)制后,接著對(duì)對(duì)象中 的非基本類型的屬性也調(diào)用 clone() 方法完成深復(fù)制,示例如下。import java. util. Date;class Obj implements Cloneableprivate Date birth=new Date();public Date getBirth()

47、return birth;public void setBirth(Date birth)this.birth=birth;public Object clone()Obj o=null;tryo=(Obj)super.clone(); catch(CloneNotSupportedException e) e.printStackTrace();/ 實(shí)現(xiàn)深復(fù)制 o.birth=(Date)this.getBirth().clone();return o;public class TestRefpublic static void main(Stringargs)Obj a=new Obj()

48、;Obj b=(Obj)a.clone();b.changeDate();程序運(yùn)行結(jié)果為:a=Sat Jul 13 23:58:56 CST 2013b=Mon May 13 23:58:56 CST 2013那么在編程時(shí), 如何選擇使用哪種復(fù)制方式呢 ?首先,檢查類有無(wú)非基本類型 (即對(duì)象)的數(shù)據(jù)成員。若沒有, 則返回 super.clone() 即可;若有,確保類中包含的所有非基本類型的成員變量都實(shí)現(xiàn)了深復(fù)制。Object o=super.clone();/先執(zhí)行淺復(fù)制對(duì)每一個(gè)對(duì)象 attr 執(zhí)行以下語(yǔ)句: o.attr=this.getAttr().clone();最后返回 o 。需要注

49、意的是, clone() 方法的保護(hù)機(jī)制在 Object 中 clone() 是被聲明為 protected 的。以 User 類為例, 通過聲明為 protected ,就可以保證只有 User 類里面才能“克隆” User 對(duì)象,原理可以參考前面關(guān)于 public 、 protected 、 private 的講解。引申:淺復(fù)制和深復(fù)制有什么區(qū)別 ?淺復(fù)制 (Shallow Clone): 被復(fù)制對(duì)象的所有變量都含有與原來(lái)對(duì)象相同的值,而所有對(duì)其他對(duì)象的引用仍 然指向原來(lái)的對(duì)象。換言之,淺復(fù)制僅僅復(fù)制所考慮的對(duì)象,而不復(fù)制它所引用的對(duì)象。深復(fù)制 (Deep Clone): 被復(fù)制對(duì)象的所有

50、變量都含有與原來(lái)對(duì)象相同的值,除去那些引用其他對(duì)象的變量。 那些引用其他對(duì)象的變量將指向被復(fù)制的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,深復(fù)制把 復(fù)制的對(duì)象所引用的對(duì)象都復(fù)制了一遍。假如定義如下一個(gè)類。class Test public int i;public StringBuffer s;下圖給岀了對(duì)這個(gè)類的對(duì)象進(jìn)行復(fù)制時(shí),淺復(fù)制與深復(fù)制的區(qū)別11. 什么事是反射機(jī)制(分?jǐn)?shù):4.00) 正確答案:()解析:反射機(jī)制是Java語(yǔ)言中一個(gè)非常重要的特性,它允許程序在運(yùn)行時(shí)進(jìn)行自我檢查,同時(shí)也允許對(duì)其內(nèi)部的成員進(jìn)行操作。雖然這個(gè)特性在實(shí)際開發(fā)時(shí)使用得不多,但是像Pascal、C和C+等語(yǔ)

51、言根本就沒有提供這樣的特性。由于反射機(jī)制能夠?qū)崿F(xiàn)在運(yùn)行時(shí)對(duì)類進(jìn)行裝載,因此能夠增加程序的靈活性,但是不 恰當(dāng)?shù)厥褂梅瓷錂C(jī)制,也會(huì)嚴(yán)重影響系統(tǒng)的性能。具體而言,反射機(jī)制提供的功能主要有:得到一個(gè)對(duì)象所屬的類;獲取一個(gè)類的所有成員變量和方法;在 運(yùn)行時(shí)創(chuàng)建對(duì)象;在運(yùn)行時(shí)調(diào)用對(duì)象的方法。其實(shí),反射機(jī)制非常重要的一個(gè)作用就是可以在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建類的對(duì)象,示例如下。class Basepublic void f()class Sub extends Basepublic void f()public class Testpublic static void main(Stringargs)try使用反

52、射機(jī)制加載類Class c=Class.forName("Sub");Base b=(Base)c.newlnstance();b. f();catch(Exception e)e.printStackTrace();程序運(yùn)行結(jié)果為:Sub在反射機(jī)制中,class是一個(gè)非常重要的類,那么如何才能獲取class類呢?總共有如下3種方法可以獲取至U class 類:1) class.forName(“類的路徑”),如上例所示。2) 類名.class 。3) 實(shí)例.getClass()。常見筆試題:Java創(chuàng)建對(duì)象的方式有幾種? 答案:共有4種創(chuàng)建對(duì)象的方法。1) 通過:new語(yǔ)

53、句實(shí)例化一個(gè)對(duì)象。2) 通過反射機(jī)制創(chuàng)建對(duì)象,見上述講解。3) 通過 clone() 方法創(chuàng)建一個(gè)對(duì)象。4) 通過反序列化的方式創(chuàng)建對(duì)象。12. package 有什么作用(分?jǐn)?shù): 4.00 ) 正確答案: ()解析: package 的中文意思是“包”,它是一個(gè)比較抽象的邏輯概念,其宗旨是把 .java 文件 (Java 源文 件)、.class文件(編譯后的文件)以及其他resource文件(例如.xml文件、avi文件、.mp3文件、.txt文 件等)有條理地進(jìn)行一個(gè)組織,以供使用。它類似于 Linux 文件系統(tǒng),有一個(gè)根,從根開始有目錄和文件, 然后目錄中嵌套目錄。具體而言, pack

54、age 主要有以下兩個(gè)作用:第一,提供多層命名空間,解決命名沖 突,通過使用package ,使得處于不同package中的類可以存在相同的名字。第二,對(duì)類按功能進(jìn)行分類,使項(xiàng)目的組織更加清晰。當(dāng)開發(fā)一個(gè)有非常多的類的項(xiàng)目時(shí),如果不使用package 對(duì)類進(jìn)行分類,而是把所有類都放在一個(gè) package 下,這樣的代碼不僅可讀性差,而且可維護(hù)性也不好,會(huì)嚴(yán)重影響開發(fā)效率。package 的用法一般如下 (源文件所在目錄為當(dāng)前目錄 ):1) 在每個(gè)源文件的開頭加上 "package packagename;" ,然后源文件所在目錄下創(chuàng)建一個(gè)新目錄,名稱為 packagename。2) 用 javac 指令編譯每個(gè) sourcename.java 源文件,將生成的 sourcename.classname 文件復(fù)制到 packagename 目錄。3) 用 java 指令運(yùn)行程序: java packagename.sourcename 。以下是一個(gè)簡(jiǎn)單的程序示例。package com.pkg;public class TestPackage通過運(yùn)行指令 編譯代碼,會(huì)在當(dāng)前目錄下自動(dòng)生成目錄 com/pkg ,然后通過運(yùn) 行指令 執(zhí)行程序,程序運(yùn)行結(jié)果為:He

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論