Java高階篇整理
阿新 • • 發佈:2019-01-11
面試中常常會問及Java細節相關的問題,而由於往往在平時中不會過多的涉及,所以不能得心應手。而通過閱讀課本和網上資料,會有一定的幫助,但紙上得來終覺淺,絕知此事須躬行。以部落格的形式梳理思路,通過一行行程式碼,深入理解Java細節,從而對於Java高階特性進行全面掌握。
Java三大特性
封裝
- 封裝三大好處
- 良好的封裝減少耦合
- 類內部的結構可以自由修改(無須修改客戶程式碼)
- 可以對成員進行精確控制(年齡範圍,性別控制等)
- 隱藏資訊,實現細節(物件的屬性私有化)
繼承
通過繼承(is-a)實現程式碼的複用。
- 繼承特點
- 子類擁有父類非private的屬性和方法
- 子類可以擁有自己的屬性和方法
- 子類可以用自己的方式實現父類的方法(重寫)
- 構造器
- 只能被呼叫,不能被繼承,super()呼叫父類的構造器。
- 子類會預設呼叫父類的構造器。
- 如果沒有預設的父類構造器,子類必須顯示呼叫指定父類的構造器,而且必須在子類構造器中的第一行程式碼實現呼叫。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- protected關鍵字
- 儘可能隱藏,但是允許子類的成員訪問。
- 指明就類使用者而言,他是private,但是對於任何繼承與此類的子類而言或者其他任何位於同一個包的類而言,他卻是可以訪問的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 向上轉型
- 專用型別向較通用型別轉換,所以總是安全的。
- 可能帶來屬性和方法的丟失。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
多型
指向子類的父類引用由於向上轉型,只能訪問父類中擁有的方法和屬性,會丟失子類中存在,而父類中不存真的方法。若子類重寫了父類的某些方法,在呼叫方法的時候,必定會使用子類中定義的方法。(動態連線,動態呼叫。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 多型的實現
- 條件(繼承、重寫、 向上轉型)
- 實現形式(繼承、介面)當子類重寫父類的方法被呼叫時,只有物件繼承鏈中的最末端的方法才會被呼叫
- 經典案例分析
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
其實在繼承鏈中物件方法的呼叫存在一個優先順序:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
四捨五入
- ROUND_UP:遠離零方向舍入。向絕對值最大的方向舍入,只要捨棄位非0即進位。
- ROUND_DOWN:趨向零方向舍入。向絕對值最小的方向輸入,所有的位都要捨棄,不存在進位情況。
- ROUND_CEILING:向正無窮方向舍入。向正最大方向靠攏。若是正數,舍入行為類似於ROUND_UP,若為負數,舍入行為類似於ROUND_DOWN。Math.round()方法就是使用的此模式。
- ROUND_FLOOR:向負無窮方向舍入。向負無窮方向靠攏。若是正數,舍入行為類似於ROUND_DOWN;若為負數,舍入行為類似於ROUND_UP。
- HALF_UP:最近數字舍入(5進)。這是我們最經典的四捨五入。
- HALF_DOWN:最近數字舍入(5舍)。在這裡5是要捨棄的。
- HAIL_EVEN:銀行家舍入法。
使用序列化實現物件的拷貝
clone()方法存在缺陷,並不會將物件的所有屬性的全部拷貝過來,而是選擇性的拷貝。規則如下
- 基本型別拷貝其值
- 物件則拷貝地址引用,也就是說此時新物件與原來物件是公用該例項變數。
- String字串,則拷貝其地址引用。但是在修改時,它會從字串池中重新生成一個新的字串,原有物件保持不變。
使用序列化來實現物件的深拷貝。在記憶體中通過位元組流的拷貝是比較容易實現的。把母物件寫入到一個位元組流中,再從位元組流中將其讀出來,這樣就可以建立一個新的物件了,並且該新物件與母物件之間並不存在引用共享的問題,真正實現物件的深拷貝。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
抽象類和介面
抽象類
- 抽象類不能被例項化
- 抽象方法必須由子類重寫
- 子類中的抽象方法不能與父類的抽象方法同名。
- abstract不能與final並列修飾同一個類
- abstract 不能與private、static、final或native並列修飾同一個方法。
介面
介面是用來建立類與類之間的協議,它所提供的只是一種形式,而沒有具體的實現
- Interface所有方法自動生命為public,當然你可以顯示的宣告為protected、private,編譯會出錯!
- 介面中德成員變數會自動變為為public static final。可以通過類命名直接訪問:ImplementClass.name。
- 實現介面的非抽象類必須要實現該介面的所有方法。抽象類可以不用實現。
抽象類和介面的區別
- 語法層次
- 設計層次
- 抽象層次不同。抽象類是對類進行抽象,介面是對行為的抽象。
- 跨域不同。抽象類所跨域的是具有相似特點的類,而介面卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然後泛化成抽象類,子類繼承該父類即可,但是介面不同。實現它的子類可以不存在任何關係,共同之處。is-a和like-a
- 設計層次不同。抽象類是自底向上抽象而來的,介面是自頂向下設計出來的。
內部類
為何需要內部類
每個內部類都能獨立繼承一個(介面)實現,無論外圍類是否已經繼承了某個介面的實現,對於內部類沒有影響。
介面只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。
- 內部類可以用於多個例項,每個例項都有自己的狀態資訊,並且與其他外圍物件的資訊相互獨立。
- 在單個外圍類中,可以讓多個內部類以不同的方式實現同一介面,或者繼承同一個類。
- 建立內部類物件的時刻並不依賴於外圍類物件的建立。
- 內部類並沒有令人迷惑的“is-a”關係,他就是一個獨立的實體。
成員內部類
- 成員內部類中不能存在任何static的變數和方法
- 成員內部類是依附於外圍類的,所以只有先建立了外圍類才能夠建立內部類。