第4章 接口﹑內(nèi)部類和包
4-1?什么是接口?接口和抽象類有哪些相同之處和不同之處?
【答】接口是一組常量和抽象方法的集合。在Java中,接口是一種引用數(shù)據(jù)類型,用關(guān)鍵字implements聲明。接口與抽象類的區(qū)別為:
相同點(diǎn):1.兩者都包含抽象方法,約定多個(gè)類共用方法的參數(shù)列表和返回值。2.兩者都不能被實(shí)例化。3.兩者都是引用數(shù)據(jù)類型,其變量可被賦值為子類或?qū)崿F(xiàn)接口類的對象。
不同點(diǎn):1.抽象類約定多個(gè)子類之間共同使用的方法;接口約定多個(gè)互不相關(guān)類之間共同使用的方法。2.抽象類與子類之間采用單重繼承機(jī)制;一個(gè)類實(shí)現(xiàn)多個(gè)接口則實(shí)現(xiàn)了多重繼承的功能。3.抽象類及其類中成員具有與普通類一樣的訪問權(quán)限;接口的訪問權(quán)限由public和缺省兩種,接口中成員的訪問權(quán)限均是public。4.抽象類中可以包含非抽象方法,也可以聲明構(gòu)造方法;接口中的方法必須全部是抽象方法,不能聲明構(gòu)造方法。5.抽象類中可以聲明成員變量,子類可以對該成員變量賦值;接口中只能聲明常量。
?
4-2?為什么能夠聲明接口變量?接口變量能夠獲得什么樣的值?
【答】接口是引用數(shù)據(jù)類型可以聲明接口變量。接口變量能夠獲得實(shí)現(xiàn)接口的類的對象,也稱為接口對象。
?
4-3?接口有哪些特點(diǎn)?為什么需要聲明借口?接口是否具有繼承性?接口中能否寫構(gòu)造方法?
【答】接口特點(diǎn):
(1)接口及接口中成員的訪問權(quán)限都是public
(2)接口中的成員方法都是公有的、抽象的實(shí)例成員方法,即默認(rèn)修飾符為public abstract。
(3)接口中的所有抽象方法必須全部被實(shí)現(xiàn)接口的類覆蓋。
(4)接口中的成員變量都是常量
(5)接口不能被實(shí)例化。接口中的方法都是抽象的,構(gòu)造方法不是抽象的所有不能寫構(gòu)造方法
(6)接口是引用數(shù)據(jù)類型。
Java只支持單重繼承,以“單重繼承+接口”的方式代替多繼承。接口可以繼承一個(gè)已經(jīng)存在的父接口。
?
4-4?什么是單重繼承?什么是多重繼承?類的層次體系為什么需要多重繼承?單重繼承有什么缺點(diǎn)?既然有缺點(diǎn),為什么Java仍然采用單重繼承?Java怎樣實(shí)現(xiàn)多重繼承?
【答】單重繼承就是一個(gè)類只能有一個(gè)父類。多繼承就是可以有多個(gè)父類?,F(xiàn)實(shí)中的對象往往表現(xiàn)出多種特性,用單重繼承無法客觀描繪,因此需要多重繼承。但是C++的多重繼承過于復(fù)雜,因此Java用“單重繼承+接口”代替了多重繼承,以提高運(yùn)行效率,增加安全性,降低復(fù)雜性。
?
4-5?類與類之間存在哪幾種關(guān)系?
【答】類與類之間有繼承關(guān)系,還存在嵌套關(guān)系。
?
4-6?在什么情況下需要聲明內(nèi)部類?內(nèi)部類有哪些特性?
【答】Java不支持C++的結(jié)構(gòu)(struct)類型,當(dāng)實(shí)際中需要使用一個(gè)結(jié)構(gòu)時(shí),可以聲明一個(gè)類;但當(dāng)結(jié)構(gòu)作為數(shù)組的元素類型時(shí),或當(dāng)一個(gè)類中需要使用結(jié)構(gòu)時(shí),可以將結(jié)構(gòu)聲明為內(nèi)部類。內(nèi)部類特性可參看課本P123。
?
4-7?為什么是包?為什么需要包機(jī)制?Java有哪些包?各有什么功能?
【答】從邏輯概念看,包是類的集合,一個(gè)包中包含多個(gè)類;從存儲(chǔ)概念看,包是類的組織方式,一個(gè)包對應(yīng)一個(gè)文件夾,一個(gè)文件夾中包含多個(gè)字節(jié)碼文件;包與類的關(guān)系,就像文件夾與文件的關(guān)系一樣。為解決字節(jié)碼文件存放和類命名的問題,Java提供了包機(jī)制。Java的常用包及其作用可查看P130表4-1?。
?
4-8 Java的API采用什么組織方式?怎樣使用Java定義好的類?
【答】Java語言的API按照功能劃分成若干包,每個(gè)包都有許多公有的類和接口。如果需要使用已定義好的一個(gè)包中的類或接口,可以使用import語句聲明。
?
4-9 Java聲明Object類的作用是什么?Object類中聲明了哪些方法?Object類在Java類層次體系中的地位是怎樣的?
【答】Object是Java中所有類的父類或祖先類,它定義了一個(gè)Java對象所需要的基本操作和屬性。定義的方法有:1.getClass()獲得當(dāng)前對象所在的類是什么、equals()比較兩個(gè)對象是否相等、toString()將當(dāng)前對象的信息用字符串描述、finalize()析構(gòu)方法。
?
4-10 Java為什么需要聲明基本數(shù)據(jù)類型的包裝類?基本數(shù)據(jù)類型的包裝類有哪些?
【答】為實(shí)現(xiàn)完全面向?qū)ο蟮奶匦裕?/span>Java為每個(gè)基本數(shù)據(jù)類型都聲明有對應(yīng)的一個(gè)類。公有8個(gè)基本數(shù)據(jù)類型的包裝類:Byte、Short、Integer、Long、Float、Double、Character、Boolean
?
4-11?怎樣將數(shù)值類型的數(shù)據(jù)轉(zhuǎn)換成字符串?怎樣將字符串轉(zhuǎn)換成數(shù)值類型的數(shù)據(jù)?
【答】Integer類的靜態(tài)方法parseInt()和實(shí)例方法intValue()都可以將一個(gè)字符串轉(zhuǎn)換成int值。Integer類的靜態(tài)方法toBinaryString(int i)、toOctalString(int i)、Integer.toHexString(int i)可以將十進(jìn)制i轉(zhuǎn)化為二進(jìn)制、八進(jìn)制、十六進(jìn)制、字符串。
?
4-12 Java為什么要將Math類聲明為最終類?Math類中有哪些常用方法?
【答】Math類提供提供E、PI常量和一組固定數(shù)學(xué)函數(shù)。都是靜態(tài)可以直接通過類名引用,不需要繼承。常用方法有:(1)求絕對值abs(double a)(2)求最大值max(double a,double b)(3)求最小值min(double a,double b)(3)返回一個(gè)0.0~1.0之間的隨機(jī)數(shù)random()
?
4-13?對數(shù)值﹑變量或?qū)ο筮M(jìn)行比較操作,到底應(yīng)該采用6個(gè)關(guān)系運(yùn)算符還是調(diào)用equals()、compareTo()方法?是否每個(gè)對象都可以調(diào)用equals()和compareTo()方法?為什么?這兩個(gè)方法在進(jìn)行比較操作時(shí)有什么差別?它們在每個(gè)類中的含義都相同嗎?
【答】對數(shù)值、變量可以采用6個(gè)關(guān)系運(yùn)算符,對象可以用后兩者,但是并不是每個(gè)對象都可以調(diào)用這兩個(gè)方法。具體用法及區(qū)別請看課本P133和P136.
?
4-14 System類、Class類和Runtime類各有哪些功能?在之前的程序中已用到這些類的哪些常量或方法?
【答】System類提供訪問系統(tǒng)資源和標(biāo)準(zhǔn)輸入/輸出流的方法,之前用到了in和out常量。Class為類提供運(yùn)行時(shí)信息,如名字、類型、以及父類等。Runtime類可直接訪問運(yùn)行時(shí)資源。
?
4-15?怎樣表示日期與時(shí)間數(shù)據(jù)?怎樣引用java.util包的類?
【答】Java以一個(gè)長整型表示一個(gè)日期,該長整型表示從格林尼治時(shí)間1970-1-1 00:00:00?開始至某時(shí)刻的累積毫秒數(shù)。
?
4-16?泛型類有什么作用?在什么情況下需要使用泛型類?
【答】泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù),這種參數(shù)類型可以用在類、接口、和方法的創(chuàng)建中,分別被稱為泛型類、泛型接口、泛型方法。泛型類引入的好處不僅在于減少代碼量,還在于提供了編譯時(shí)期數(shù)據(jù)類型的檢查功能,可以提前預(yù)知錯(cuò)誤的發(fā)生,減少代碼安全性,二是減少了強(qiáng)制轉(zhuǎn)換類型。