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