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