錯題整理——過載、重寫、繼承等細節
1.方法過載(method overload)
如果有兩個方法的方法名相同,但引數不一致,那麼可以說一個方法是另一個方法的過載。
- 方法名一定要相同。
- 方法的引數表必須不同,包括引數的型別個數、順序,以此區分不同的方法體。
- 方法的返回型別、修飾符可以相同,也可不同。
- main方法也可以被過載
方法過載的作用:可以一個相同的方法傳入不同的引數以達到想要的結果
2、方法覆蓋(method override)
方法覆寫時應遵循的原則(一同兩小一大):
(一同):方法簽名必須相同;
(兩小):
- 子類方法的返回值型別比父類方法的返回值型別更小或相等
- 子類方法宣告丟擲的異常應比父類方法申明丟擲的異常更小或相等;
(一大):子類方法的訪問許可權應比父類方法更大或相等;
重寫特點
- 方法覆蓋只存在於子類和父類之間,同一個類中只能過載
- 父類的靜態方法不能被子類覆蓋為非靜態方法
- 子類可以定義於父類的靜態方法同名的靜態方法,以便在子類中隱藏父類的靜態方法(滿足覆蓋約束),
- 而且Java虛擬機器把靜態方法和所屬的類繫結,而把例項方法和所屬的例項繫結。
- 父類的非靜態方法不能被子類覆蓋為靜態方法
- 父類的私有方法不能被子類覆蓋
- 父類的抽象方法可以被子類通過兩種途徑覆蓋(即實現和覆蓋)
- 父類的非抽象方法可以被覆蓋為抽象方法
方法繼承
利用extends關鍵字一個方法繼承另一個方法,而且只能直接繼承一個類。
- 當Sub類和Base類在同一個包時Sub類繼承Base類中的public/protected/預設級別的變數個方法
備註:在不同包時繼承public/protected級別的變數和方法。
- 方法繼承的作用可以提高程式碼的重用性和安全性
Java中的不同包中的訪問許可權
1,public 2,protected 3,(default) 4,private
1任何類都可以訪問
2在同一個包中的所有類可以訪問,以及該類的子類
3同一個包中的所有類
4只能在本類中訪問
Super關鍵字
super和this關鍵字都可以用來覆蓋Java語言的預設作用域,使被遮蔽的方法或變數變為可見。
- 父類的成員變數和方法為private使用super訪問編譯出錯
- 在類的構造方法種,通過super語句呼叫這個類的父類的構造方法
- 在子類種訪問父類的被遮蔽的方法和屬性
- 只能在構造方法或例項方法內使用super關鍵字,而在靜態方法和靜態程式碼塊內不能使用super
多型
- 對於一個引用型別的變數,Java編譯器按照它的宣告的型別來處理
- 對於一個引用型別的變數,執行時Java虛擬機器按照它的實際引用的物件來處理
- 執行時環境中,通過引用型別變數來訪問所引用物件的方法和屬性時,Java虛擬機器採用以下繫結規則
1)例項方法與引用變數實際引用的物件的方法繫結,屬於動態繫結
2)靜態方法與引用變數所宣告的型別的方法繫結,屬於靜態繫結
3)成員變數(包括靜態和例項變數)與引用變數所宣告的型別的成員變數繫結,屬於靜態繫結
備註:上轉型物件
上轉型物件具有如下特點:
1)上轉型物件不能操作子類新增的成員變數(失掉了這部分屬性),不能使用子類新增的方法(失掉了一些功能).
2)上轉型物件可以操作子類繼承或隱藏的成員變數,也可以使用子類繼承的或重寫的方法.
3)上轉型物件操作子類繼承或重寫的方法時,就時通知對應的子類物件去呼叫這些方法.因此,如果子類重寫了父類的某個方法後,物件的上轉型物件呼叫這個方法時,一定是呼叫了這個重寫的方法.
4)可以講物件的上轉型物件再強制轉換到一個子類的物件,這時,該子類物件又具備了子類的所有屬性和功能.(也就是下溯)
概括就是上轉型物件用的是父類的變數和方法,子類只能重寫(覆蓋)父類的方法,因為是動態繫結的
作用:多型有編譯時多型 和執行時多型。
第一個是通過方法過載實現;第二個是通過方法覆蓋實現(子類覆蓋父類方法)。
第一種就是我們呼叫方法是區分引數型別,程式會自動執行相應方法,如: 加法運算,可以使int相加,可以是double相加,都是同一個方法名。
第二種就是動態繫結,使用父類引用指向子類物件,再呼叫某一父類中的方法時,不同子類會表現出不同結果。 這樣的作用就是擴充套件性極好,玩過網遊的話應該知道 遊戲中有不同的角色,它們都有一個父類,它們做相同動作時表現出來的效果就會不一樣,比如跑,魔法師的跑跟戰士的跑就不會一樣,這就是倆者都覆蓋了父類中的跑方法,各自有自己的現實,表現出來多型。 如果有一天你想再加個角色,只用再寫一個類繼承該父類,覆蓋其中的跑方法就行了,其他程式碼不用怎麼改,所以可維護性也很好。
6、繼承的利弊和使用原則:
- 整合數的層次不可太多
- 整合數的上層為抽象層
(1)定義了下層子類都用友的相同屬性和方法,並且儘可能預設實現,從而提高重用性
(2)代表系統的介面,描述系統所能提供的服務
- 繼承關係最大的弱點:打破封裝
- 精心設計專門用於被繼承的類
(1)對這些類必須提供良好的文件說明
(2)儘可能的封裝父類的實現細節,把代表時間細節的屬性和方法定義為private型別
(3)如果某些實現細節必須被子類訪問,定義為protected型別
(4)把不允許子類覆蓋的方法定義為final型別
(5)父類的構造方法不允許呼叫可被子類覆蓋的方法
(6)如果某些類不是專門為了繼承而設計,那麼隨意繼承它是不安全的