1. 程式人生 > >錯題整理——過載、重寫、繼承等細節

錯題整理——過載、重寫、繼承等細節

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)如果某些類不是專門為了繼承而設計,那麼隨意繼承它是不安全的