Java基礎-物件導向基礎

Merbng發表於2018-05-12

物件導向基礎.gif
物件導向三要素:繼承、封裝、多型。

繼承:
  • 繼承基類的方法,並作出自己的擴充套件。
  • 宣告某個子類相容於某基類(或者說,介面上完全相容於基類),外部呼叫者可無需關注其差別(內部機制會自動請求派發dispatch到合適的邏輯)。
封裝:

封裝的意義,在於明確標識出允許外部使用的所有成員函式和資料項,或者叫介面。

多型:

基於物件所屬類的不同,外部對同一個方法的呼叫,實際執行的邏輯不同,很顯然,多型實際上是依附於繼承的第二種含義的。

多型

方法簽名:方法名+引數列表(引數型別、個數、順序)

重寫

子類重寫父類方法,只有例項方法可以被重寫,重寫後的方法必須仍為例項方法。成員變數和靜態方法都不能被重寫,只能被隱藏。

重寫例項方法 :超類Parent中有例項方法A,子類child定義了與A相同簽名和子集返回型別的例項方法B,子類物件childObj只能呼叫自己的例項方法B。

方法的重寫(override)兩同兩小一大原則:

1.方法名相同,引數型別相同。

2.子類返回型別小於等於父類方法返回型別。

3.子類丟擲異常小於等於父類方法丟擲異常。

4.子類訪問許可權大於等於父類方法訪問許可權。

注意:

  • 不能重寫static靜態方法,(形式上可以寫,但本質上不是重寫,屬於下面要講的隱藏)
  • 重寫方法可以改變其他的方法修飾符,如final,synchroized,native。不管被重寫方法中有無final修飾的引數,重寫方法都可以增加、保留、去掉這個引數的final修飾符(引數修飾符不屬於方法簽名)
過載

在同一個類中,有多個方法名相同,引數列表不同(引數個數不同,引數型別不同),與方法的返回值無關,與許可權修飾符無關。編譯器通過方法簽名的識別即可靜態編譯出不同的方法,這也是java中過載與重寫的區別之一。

過載只是一種語言特性,與多型無關,與物件導向無關,多型是為了實現介面重用。

java中方法是可以和類名同名的,和構造方法唯一的區別就是,構造方法沒有返回值。

隱藏

隱藏與覆蓋在形式上極其類似(語法規則),但是有本質的區別:只有成員變數(不管是不是靜態的)和靜態方法可以被隱藏。

成員變數

超類Parent中有成員變數A,子類Child定義了與A同名的成員變數B,子類物件ChildObj呼叫的是自己的成員變數B,如果把子類物件ChildObj轉換成超類物件ParentObj,ParentObj呼叫的是超類成員變數A! 1.隱藏成員變數時,只要同名即可,可以更改變數型別(無論基本型別還是隱藏型別) 2.不能隱藏超類中private成員變數,換句話說,只能隱藏可以訪問的成員變數。 3.隱藏超類成員變數A時,可以降低或提高子類成員變數B的訪問許可權,只要A不是private。 4.隱藏成員變數與是否靜態無關!靜態變數可以隱藏例項變數,例項變數也可以隱藏靜態變數。 5.可以隱藏超類中的final成員變數。

靜態方法

超類Parent有靜態方法A,子類Child定義了與A相同簽名和子集返回型別的靜態方法B,子類物件ChildObj呼叫的是子集的靜態方法B,如果把子類物件ChildObj轉換為超類物件ParentObj,ParentObj呼叫的是超類的靜態方法A!

隱藏後的方法必須仍為靜態方法

相關文章