11.Java面向過程的三大特性:封裝、繼承、多態(tài)
封裝
封裝把一個對象的屬性私有化,同時提供一些可以被外部訪問的屬性和方法,如果屬性不想被外界訪問, 我們就不需要提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類沒有什么意義
繼承
繼承是使用已存在作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的屬性或者功能,也可以用父類的功能,但不能選擇性的繼承父類。通過使用繼承我們能夠非常方便地復(fù)用以前的代碼。
- 子類擁有父類所有的屬性和方法(包括私有屬性、私有方法),但是無法訪問父類中私有屬性和私有方法。
- 子類可以擁有自己的屬性和方法,在父類的基礎(chǔ)上進(jìn)行擴展
- 子類可以用自己的方式實現(xiàn)父類的方法(重寫)
多態(tài)
所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編譯時并不確定,而是在程序運行期間才確定,即一個引用變量(A)到底會指向哪個類的實例對象(B),該引用變量(A)發(fā)出的方法調(diào)用到底是調(diào)用哪個類中實現(xiàn)的方法,必須在程序運行期間才知道。
- 方法的多態(tài)性體現(xiàn)在:方法的重載過程。方法傳遞不同的參數(shù)就可以調(diào)用同一方法接口實現(xiàn)不同的功能
- 對象的多態(tài)性體現(xiàn)在:向上轉(zhuǎn)型和向下轉(zhuǎn)型
1.向上轉(zhuǎn)型:父類對象通過子類對象去實例化,實際上就是對象的對象的向上轉(zhuǎn)型,期間不需要強制扎強制轉(zhuǎn)換,但是可能會丟失精度,這個過程是自動完成的。
2.向下轉(zhuǎn)型:父類對象可以裝換為子類對象,但是必須通過強制轉(zhuǎn)換
12. String StringBuffer和 StringBuilder 的區(qū)別是什么? String為什么是不可變的?
可變性
String類中使用final關(guān)鍵字修飾字符數(shù)組來保存字符串private final char value[]
所以String對象是不可變的。而StringBuilder與StringBuffer都繼承自AbstractBuilder類,在AbstractBuilder中也是使用字符數(shù)組來保存字符串char [] value 但是沒有使用final關(guān)鍵字修飾,所以這兩個對象是可變的。
線程安全性
String中的對象是不可變的,也可以理解為常量,線程安全。
StringBuffer添加了同步鎖或者對調(diào)用的方法加了同步鎖,線程安全
StringBuilder并沒有添加同步鎖,非線程安全。
性能
每次對String類進(jìn)行改變的時候,都會生成新的String對象,然后將指針指向新的String對象。
StringBuffer每次都會對StringBuffer本身進(jìn)行操作,而不是生成新的對象并且改變對象引用。相同的情況下StringBuilder由于是非線程安全的,性能提升了10%-15%
總結(jié):
1.操作少量的數(shù)據(jù)使用String
2.單線程操作緩沖區(qū)下操作大量數(shù)據(jù):StringBuilder
3.多線程線程操作緩沖區(qū)下操作大量數(shù)據(jù):StringBuffer
13.自動裝箱與自動拆箱
- 裝箱:基本類型->引用類型包裝起來
- 拆箱:包裝類->基本數(shù)據(jù)類型
14.在一個靜態(tài)方法內(nèi)調(diào)用一個非靜態(tài)成員為什么是非法的?
由于靜態(tài)方法可以不通過對象進(jìn)行調(diào)用,因此在靜態(tài)方法里,不能調(diào)用其他非晶態(tài)方法,也不可以訪問非靜態(tài)變量成員
15.在Java中定義無參構(gòu)造的作用
Java程序在執(zhí)行子類的構(gòu)造方法前,如果沒有用super()來調(diào)用父類的特定的構(gòu)造方法,則會調(diào)用父類的"無參構(gòu)造"。因此,如果父類中只定義了有參構(gòu)造(A),而在子類的構(gòu)造函數(shù)又沒有使用super()來調(diào)用父類中特定的構(gòu)造方法(A),則會發(fā)生編譯的時候會發(fā)生錯誤,因為Java程序在父類中找不到?jīng)]有參數(shù)的構(gòu)造方法可供執(zhí)行。解決辦法就是在父類中定義一個無參構(gòu)造。
16.import java和java有什么區(qū)別?
剛開始的時候JavaAPI所需要的包是java開頭的包,javax當(dāng)時只是擴展API包來使用。然而隨著時間的推移,javax逐漸擴展為Java API 的組成部分。但是,將擴展包從javax包移植到j(luò)ava包確實太麻煩了,最終javax包成為標(biāo)準(zhǔn)API的一部分,
兩者之間實際上沒有區(qū)別*。
17.接口和抽象類區(qū)別是什么(針對JDK8而言)?

補充:從設(shè)計層面來說,抽象是對類的抽象,是一種模板設(shè)計,而接口是對行為的抽象,是一種行為的規(guī)范
抽象類必須要有抽象方法嗎?
抽象類中不一定包含抽象方法,但是包含抽象方法的類一定要被聲明為抽象類。
抽象類能使用 final 修飾嗎?
抽象類不能用 final 來修飾。當(dāng)用 final 修飾一個類時,表明這個類不能被繼承。 final 類中的所有成員方法都會被隱式地指定為 final 方法,這明顯違背了抽象類存在的意義了。
18.成員變量與局部變量的區(qū)別有哪些?

19.創(chuàng)建一個對象用什么運算符?對象實體與對象引用有何不同?
new運算符,new創(chuàng)建對象實例(存在堆內(nèi)存中),對象引用指向?qū)ο髮嵗?對象引用存放在棧中)。一個對象引用可以指向0個或者1個對象(一根繩子可以不系氣球也可以系一個氣球);一個對象可以有n個引用指向它(可以用n條繩子系住一個氣球)。
20.什么是方法的返回值?返回值在類的方法里面有什么作用?
方法的返回值是指=某個方法體中的代碼執(zhí)行后產(chǎn)生的結(jié)果(前提是能有返回值)。返回值的作用是接收出結(jié)果,使得它可以進(jìn)行其他的操作!