1. 程式人生 > >【知了堂學習筆記】java基礎知識之繼承

【知了堂學習筆記】java基礎知識之繼承

內存 關鍵字 保留 new 目的 不同 super() 如何 筆記

  繼承的好處

  1. 提高代碼的復用性。
  2. 讓類與類之間產生了關系,給第三個特征多態提供了前提。(無繼承無多態)

Java中支持單繼承,不直接支持多繼承,但對c++中的多繼承機制進行改良。

單繼承:一個子類只能有一個父類。

多繼承:一個子類可以有多個直接父類(java中不允許,進行改良)

不直接支持,是因為多個父類中有相同成員,會產生調用不確定性。

java中時通過“多實現”的方式體現。

Java支持多層(多重)繼承

當要使用一個繼承體系時:

  1. 查看該體系中的頂層類,了解該體系的基本功能。
  2. 創建體系中的最子類對象,完成功能的使用。

什麽時候定義繼承呢?

當類與類之間存在著所屬關系的時候,就定義繼承。

Xc中的一種,x extends c;

當本類的成員和局部變量同名,用this區分。

當子父類中的成員變量同名用super區分。

Thissuper的用法很相似。

This:代表本類對象的引用。

Super:代表一個父類的空間。

在子父類中,成員特點體現(子類不能直接訪問父類中私有的內容)

  1. 成員變量(子類有,就不在父類中尋找)
  2. 成員函數(子類有,就運行子類的函數)

函數兩個特性:

  1. 重載,同一個類中。
  2. 覆蓋,在子類中,覆蓋也成為重寫,override

覆蓋註意事項

  1. 子類覆蓋父類方法時,子類權限必須大於父類的權限。
  2. 父類方法為private修飾時,子類不能覆蓋。
  3. 靜態只能覆蓋靜態,或被靜態覆蓋。

什麽時候使用覆蓋操作?

當對一個類進行子類的擴展時,子類需要保留父類的功能聲明,但是要定義子類中該功能的特有內容時,就使用覆蓋操作完成。

子父類構造函數特點

在子類構造對象時,發現訪問子類構造函數時,父類也運行了。

為什麽?

在子類的構造函數中,第一行有一個默認的隱式語句 -----> super();//調用的是父類中空參數的構造函數

子類的構造函數(無論有 還是無參),第一行的默認隱式語句都是super();

為什麽子類實例化的時候要訪問父類中的構造函數呢?

子類繼承父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的,所以子類在構造對象時,必須訪問父類中的構造函數。

為了完成這個必須的動作,就在子類的構造函數中加入了super()語句。

如果父類中沒有定義空參數構造函數,那麽子類的構造函數必須用super明確要調用父類中的哪個構造函數。同時子類的構造函數中,如果使用this調用本類構造函數時,super就沒有了。因為superthis都只能定義第一行。所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數。

註意:super語句必須定義在子類構造函數的第一行。因為父類的初始化動作要先完成。

子類對象初始化必須訪問至少一個父類。

註意--->沒有父類的情況下:先默認初始化,再構造函數初始化,然後再顯示初始化,

但是有父類的情況下:通過super初始化父類內容時,子類的成員變量並未顯示初始化,而是默認初始化0。等super()父類初始化完畢後,才進行子類的成員變量顯示初始化8

一個對象實例化過程:

Person p = new Person();

  1. jvm會讀取指定的路徑下的Person.class文件,並加載進內存,並會先加載person的父類(如果有直接的父類的情況下)。
  2. 在堆內存中的開辟空間,分配地址。
  3. 並在對象空間中,對對象中的屬性進行默認初始化。
  4. 調用對應的構造函數進行初始化。
  5. 在構造函數中,第一行會先調用父類中構造函數進行初始化。
  6. 父類初始化完畢後,在對子類的屬性進行顯示初始化。
  7. 在進行子類構造函數的特定初始化。
  8. 初始化完畢後,將地址值賦給引用變量。

Ps:引用變量不一定在棧內

Class demo{

Person p = new Person();//在堆內,成員變量。

}

final關鍵字

繼承弊端:打破了封裝性。

Final關鍵字(最終的):

  1. Final是一個修飾符,可以修飾類,方法,變量。
  2. Final修飾的類不可以被繼承。
  3. Final修飾的方法不可以被覆蓋。
  4. Final修飾的變量是一個常量,只能賦值一次。
  5. Final固定的是顯示初始化值,默認初始化值是無效數據。

為什麽要用final修飾變量?

在程序中,如果一個數據是固定的,直接使用這個數據就可以了,但是這樣閱讀性差。所以給該數據起個名稱。而且這個變量名稱的值不能變化,所以加上final固定。

寫法規範:

常量值用大寫,單詞之間用下劃線鏈接。MY_PI

變量值首個單詞小寫,之後單詞首字母大寫。getMax

繼承(下)

抽象類:

抽象:不具體。

特點:

  1. 方法只有聲明沒有實現時,該方法就是抽象方法,需要被abstract修飾。

抽象方法必須定義在抽象類中,該類必須也被abstract修飾。

  1. 抽象類不可以被實例化/為什麽?因為調用抽象方法沒有意義。
  2. 抽象類必須有其子類覆蓋了所有的抽象方法後,該子類才可以實例化。否則,這個子類還是抽象類。

抽象類問題

  1. 抽象類中有構造函數嗎?

有,用於給子類對象進行初始化。

  1. 抽象類可以不定義抽象方法嗎?

可以的,但是少見,目的就是不讓該類創建對象,AWT的適配器對象就是這種類。

通常這個類中的方法有方法體,但是缺沒內容。

  1. 抽象類關鍵字不可以和哪些關鍵字共存?

Private-->Egprivate abstract void show(); ---> 私有方法不能被子類發現,就不能被覆蓋。

Static-->egstatic abstract void show();--->類名.方法。方法中沒有方法體,沒有意義。

Final-->egfinal abstract void show();--->final修飾不能覆蓋,abstract 需要被覆蓋。

  1. 抽象類和一般類的區別?

相同點:抽象類和一般類都是用來描述事物的,都在內部定了成員。

不同點:1.一般類有足夠的信息描述事物;抽象類描述事物的信息有可能不足。

2.一般類中不能定義抽象方法,只能定義非抽象方法;抽象類中可以定義抽象方法,同時也可以定義非抽象方法。

3.一般類可以被實例化;抽象類不可以被實例化。

  1. 抽象類一定是一個父類嗎?

是的,因為需要子類覆蓋其方法後才可以對子類實例化。

【知了堂學習筆記】java基礎知識之繼承