重慶網(wǎng)站建設(shè)推薦百度收錄怎么弄
文章目錄
- 1. JDK、JRE、JVM之間的關(guān)系
- 2. 補充
- 3. 面試題:重載和重寫的區(qū)別?
- 4. super和this
- 5. (重點!!)若父類和子類均有靜態(tài)代碼塊、實例代碼塊以及無參構(gòu)造方法,則繼承關(guān)系上的執(zhí)行順序:
- 6. 靜態(tài)綁定和動態(tài)綁定
- 7. 抽象類了解
- 8. 接口了解
- 7. 抽象類和接口的區(qū)別(重點!)
- 8. Object類有12個成員方法,分別是
- 9. 為什么String要設(shè)計成不可變的?(不可變對象的好處?)
- 10. String、StringBuffer、StringBuilder的區(qū)別
- 11. 異常體系
努力經(jīng)營當(dāng)下 直至未來明朗!
1. JDK、JRE、JVM之間的關(guān)系
2. 補充
1) 前置和后置++的使用,后置++只有在表達式結(jié)束之后才對本身進行++
2)& 和 | 如果表達式結(jié)果為 boolean 時, 也表示邏輯運算;但與 && || 相比, 它們不支持短路求值
3)三目運算符:表達式1 ? 表達式2 : 表達式3;
表達式2和表達式3的結(jié)果要是同類型的,除非能發(fā)生類型隱式類型轉(zhuǎn)換(注意最后的輸出結(jié)果)
4)不能做switch的參數(shù)的類型: long float double boolean
補:字符串以及枚舉(1.5之后版本才有)都可以、byte 、char、short、int可以作為參數(shù)
5)2的k次方二進制只有一個1,so:n=n & (n-1) ==0
6)方法簽名:經(jīng)過編譯器編譯修改過之后方法最終的名字。
具體方式:方法全路徑名+參數(shù)列表+返回值類型,構(gòu)成方法完整的名字。
7)找出僅出現(xiàn)一次的數(shù)字并打印輸出(按位異或):0^n=n. n^n=0
8)java中局部變量必須初始化,否則會報錯!!
9)二維數(shù)組打印:Arrays.deepToString(數(shù)組名);
10) ①先執(zhí)行靜態(tài)代碼塊【加載了類就會被執(zhí)行】
② 如果有多個靜態(tài)的,那么看定義順序(會存在覆蓋)
③ 如果沒有實例化對象,那么只會執(zhí)行靜態(tài)的(注:靜態(tài)的只會執(zhí)行一次)
⑤ 實例的數(shù)據(jù)【有多個實例對象,要看定義的順序】
⑥ 構(gòu)造方法的執(zhí)行(即:靜態(tài)塊、實例塊、構(gòu)造方法)
11)局部變量在使用時需要進行初始化
12)static與super不共存–super依賴父類對象
13)String 字符串類, 就是用 final 修飾的, 不能被繼承
14)重寫是子類對父類非靜態(tài)、非private修飾,非final修飾,非構(gòu)造方法等的實現(xiàn)過程進行重新編寫, 返回值和形參類型都不能改變。
15)向上轉(zhuǎn)型:子類對象可以直接賦值給父類對象,此時只能引用父類里面的方法和屬性,子類自己的不可以調(diào)用。
3. 面試題:重載和重寫的區(qū)別?
-
重寫規(guī)則】
1)子類在重寫父類的方法時,一般必須與父類方法原型一致:修飾符 返回值類型 方法名(參數(shù)列表) 要完全一致
2)被重寫的方法返回值類型可以不同,但是必須是具有父子關(guān)系的(父子類關(guān)系!!)
3)子類訪問權(quán)限不能比父類中被重寫的方法的訪問權(quán)限更低。例如:如果父類方法被public修飾,則子類中重寫該方法就不能聲明為 protected
4)父類被static、private、final修飾的方法、構(gòu)造方法都不能被重寫。
5)重寫的方法, 可以使用 @Override 注解來顯式指定. 有了這個注解能幫我們進行一些合法性校驗. 例如不小心將方法名字拼寫錯了 (比如寫成 aet), 那么此時編譯器就會發(fā)現(xiàn)父類中沒有 aet 方法, 就會編譯報錯, 提示無法構(gòu)成重寫 -
重寫和重載的區(qū)別
即:方法重載是一個類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。 -
小結(jié):
補充【方法重寫】:方法返回值、方法名、參數(shù)列表(順序、個數(shù)、類型)一致、static的方法不能重寫、private修飾的方法不能重寫、final修飾的方法不能重寫、構(gòu)造方法不能重寫、子類的訪問修飾符需要大于等于父類的訪問修飾符
(注意:重寫返回值類型可以不同:子類的返回值和父類的返回值是父子類關(guān)系也可以 【協(xié)變類型】)
4. super和this
- 【相同點】
1)都是Java中的關(guān)鍵字
2)只能在類的非靜態(tài)方法中使用,用來訪問非靜態(tài)成員方法和字段
3)在構(gòu)造方法中調(diào)用時,必須是構(gòu)造方法中的第一條語句,并且不能同時存在 - 【不同點】
1)this是當(dāng)前對象的引用,當(dāng)前對象即調(diào)用實例方法的對象,super相當(dāng)于是子類對象中從父類繼承下來部分成員的引用
2)在非靜態(tài)成員方法中,this用來訪問本類的方法和屬性,super用來訪問父類繼承下來的方法和屬性
3) this是非靜態(tài)成員方法的一個隱藏參數(shù),super不是隱藏的參數(shù)
4) 在構(gòu)造方法中:this(…)用于調(diào)用本類構(gòu)造方法,super(…)用于調(diào)用父類構(gòu)造方法,兩種調(diào)用不能同時在構(gòu)造方法中出現(xiàn)
5)構(gòu)造方法中一定會存在super(…)的調(diào)用,用戶沒有寫編譯器也會增加,但是this(…)用戶不寫則沒有
5. (重點!!)若父類和子類均有靜態(tài)代碼塊、實例代碼塊以及無參構(gòu)造方法,則繼承關(guān)系上的執(zhí)行順序:
1、父類、子類靜態(tài)代碼塊
(即:父類靜態(tài)代碼塊優(yōu)先于子類靜態(tài)代碼塊執(zhí)行,且是最早執(zhí)行)
2、父類實例代碼塊和構(gòu)造方法
3、子類實例代碼塊和構(gòu)造方法
若再new實例化一次對象,則靜態(tài)代碼塊不會執(zhí)行,因為靜態(tài)代碼塊只執(zhí)行一次
6. 靜態(tài)綁定和動態(tài)綁定
【靜態(tài)綁定】:也稱為前期綁定(早綁定),即在編譯時,根據(jù)用戶所傳遞實參類型就確定了具體調(diào)用哪個方法。典型代表:方法重載。
【動態(tài)綁定】:也稱為后期綁定(晚綁定),即在編譯時,不能確定方法的行為,需要等到程序運行時,才能夠確定具體調(diào)用那個類的方法。
7. 抽象類了解
- 抽象類中不一定含有抽象方法,但是抽象方法屬于抽象類。
- 注意:抽象類也是類,內(nèi)部可以包含普通方法和屬性,甚至構(gòu)造方法。
- 抽象方法沒有具體的實現(xiàn)體
- 抽象方法不能是private的
注意:抽象方法沒有加訪問限定符時,默認是public. - 抽象方法不能被final和static修飾,因為抽象方法要被子類重寫
- 抽象方法不能被private、static、final等修飾,不能實例化對象
- 抽象類可以有構(gòu)造方法
8. 接口了解
- 類重寫父類方法時,修飾符一定要大于等于父類的(注意:接口總默認省略的是public,則子類重寫時一定要加public修飾,否則編譯報錯)
- 接口中每一個方法都是public的抽象方法, 即接口中的方法會被隱式的指定為 public abstract(只能是
public abstract
,其他修飾符都會報錯) - 接口中可以含有變量,但是接口中的變量會被隱式的指定為
public static final
變量
(注:必須賦初值;且后續(xù)不能被修改,具有final屬性) - 接口中不能有靜態(tài)代碼塊和構(gòu)造方法
- 深拷貝與淺拷貝
淺拷貝Cloneable:改變原來的對象,拷貝好的對象也會被影響–即:地址不改變
深拷貝:兩者互不干涉-地址并不相同–類與對象均拷貝
7. 抽象類和接口的區(qū)別(重點!)
核心區(qū)別: 抽象類中可以包含普通方法和普通字段, 這樣的普通方法和字段可以被子類直接使用(不必重寫), 而接口中不能包含普通方法, 子類必須重寫所有的抽象方法。
- 共同點:都不能實例化
- 異:
1)抽象類可以包含非抽象方法,而接口只能包含抽象方法。
2)類只能繼承一個抽象類,但可以實現(xiàn)多個接口。
3)抽象類可以有構(gòu)造方法,而接口不能有構(gòu)造方法。
4)抽象類可以有成員變量,而接口只能有常量。
5)抽象類的方法可以有public、protected和default訪問修飾符,而接口的方法只能有public訪問修飾符。
6)抽象類的子類必須實現(xiàn)所有抽象方法,而實現(xiàn)接口的類必須實現(xiàn)所有接口中的方法。
7)抽象類可以有普通方法,而接口不能有普通方法。 - 區(qū)別圖
- 注:抽象方法均沒有方法體!也沒有花括號!
- 接口當(dāng)中可以有靜態(tài)成員方法,但是不管靜態(tài)成員方法還是default方法,都是public修飾的(沒有abstract)
- 接口中不能有靜態(tài)、實例代碼塊、構(gòu)造方法,抽象類可以有構(gòu)造方法、靜態(tài)塊和實例塊。
8. Object類有12個成員方法,分別是
clone():Object、equals(Object):boolean、finalize():void、getClass()、hashCode():int、notify():void、notifyAll():void、toString():String、wait():void、wait(long):void、wait(long,int):void
9. 為什么String要設(shè)計成不可變的?(不可變對象的好處?)
1)方便實現(xiàn)字符串對象池。如果 String 可變, 那么對象池就需要考慮寫時拷貝的問題了。
2)不可變對象是線程安全的。
3)不可變對象更方便緩存 hash code, 作為 key 時可以更高效的保存到 HashMap 中。
10. String、StringBuffer、StringBuilder的區(qū)別
1)String的內(nèi)容不可修改,StringBuffer與StringBuilder的內(nèi)容可以修改. (內(nèi)容可修改性)
2)StringBuffer與StringBuilder大部分功能是相似的 (功能)
3)StringBuffer采用同步處理,屬于線程安全操作;而StringBuilder未采用同步處理,屬于線程不安全操作 (處理與線程安全)
11. 異常體系
1)Throwable:是異常體系的頂層類,其派生出兩個重要的子類: Error 和 Exception
2) Error:指的是Java虛擬機無法解決的嚴重問題,比如:JVM的內(nèi)部錯誤、資源耗盡等,典型代表:StackOverflowError和OutOfMemoryError,一旦發(fā)生回力乏術(shù)。
3) Exception:異常產(chǎn)生后程序員可以通過代碼進行處理,使程序繼續(xù)執(zhí)行。我們平時所說的異常就是Exception。