day09【繼承、super、this、抽象類】

一、繼承的格式

在繼承的關係中,“子類就是一個父類”。也就是說,子類可以被當做父類看待。
例如父類是員工,子類是講師,那麼“講師就是一個員工”。關係:is-a。

定義父類的格式:(一個普通的類定義)

public class 父類名稱 {
    // ...
}

定義子類的格式:
public class 子類名稱 extends 父類名稱 {
    // ...
}

二、繼承後的特點——子類父類 重名成員變量

在父子類的繼承關係當中,如果成員變量重名,則創建子類對象時,訪問有兩種方式

  • 直接通過子類對象訪問成員變量:
    等號左邊是誰,就優先用誰,沒有則向上找。
  • 間接通過成員方法訪問成員變量:
    該方法屬於誰,就優先用誰,沒有則向上找。

三、繼承後的特點——子類父類 重名成員方法

在父子類的繼承關係當中,創建子類對象,訪問成員方法的規則:

  • 創建的對象是誰,就優先用誰,如果沒有則向上找。

注意事項: 無論是成員方法還是成員變量,如果沒有都是向上找父類,絕對不會向下找子類的。

重寫(Override)

概念:在繼承關係當中,方法的名稱一樣,參數列表也一樣。

重寫(Override):方法的名稱一樣,參數列表【也一樣】。覆蓋、覆寫。
重載(Overload):方法的名稱一樣,參數列表【不一樣】。

重寫特點:

方法的覆蓋重寫特點:創建的是子類對象,則優先用子類方法。

  1. 必須保證父子類之間方法的名稱相同,參數列表也相同。
    @Override:寫在方法前面,用來檢測是不是有效的正確覆蓋重寫。
    這個註解就算不寫,只要滿足要求,也是正確的方法覆蓋重寫。

  2. 子類方法的返回值必須【小於等於】父類方法的返回值範圍。
    小擴展提示:java.lang.Object類是所有類的公共最高父類(祖宗類),java.lang.String就是Object的子類。

  3. 子類方法的權限必須【大於等於】父類方法的權限修飾符。
    小擴展提示:public > protected > (default) > private
    備註:(default)不是關鍵字default,而是什麼都不寫,留空。

三個變量表示方式
  • 局部變量: 直接寫成員變量名
  • 本類的成員變量: this.成員變量名
  • 父類的成員變量: super.成員變量名

四、繼承後的特點——構造方法

繼承關係中,父子類構造方法的訪問特點:

  1. 子類構造方法當中有一個默認隱含的“super()”調用,所以一定是先調用的父類構造,後執行的子類構造。
  2. 子類構造可以通過super關鍵字來調用父類重載構造。
  3. super的父類構造調用,必須是子類構造方法的第一個語句。不能一個子類構造調用多次super構造。

總結: 子類必須調用父類構造方法,不寫則贈送super( );寫了則用寫的指定的super調用,super只能有一個,還必須是第一個。

super和this

super:

super關鍵字的用法有三種:

  1. 在子類的成員方法中,訪問父類的成員變量。
  2. 在子類的成員方法中,訪問父類的成員方法。
  3. 在子類的構造方法中,訪問父類的構造方法。
    super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容。用法也有三種:
this:

super關鍵字用來訪問父類內容,而this關鍵字用來訪問本類內容。用法也有三種:

  1. 在本類的成員方法中,訪問本類的成員變量。
  2. 在本類的成員方法中,訪問本類的另一個成員方法。
  3. 在本類的構造方法中,訪問本類的另一個構造方法。
    在第三種用法當中要注意:
    A. this(…)調用也必須是構造方法的第一個語句,唯一一個。
    B. super和this兩種構造調用,不能同時使用。

四、抽象類

父類中的方法,被它的子類們重寫,子類各自的實現都不盡相同。那麼父類的方法聲明和方法主體,只有聲明還有
意義,而方法主體則沒有存在的意義了。我們把沒有方法主體的方法稱爲抽象方法。Java語法規定,包含抽象方法
的類就是抽象類。

抽象方法:就是加上abstract關鍵字,然後去掉大括號,直接分號結束。
抽象類:抽象方法所在的類,必須是抽象類纔行。在class之前寫上abstract即可。

如何使用抽象類和抽象方法:

  1. 不能直接創建new抽象類對象。
  2. 必須用一個子類來繼承抽象父類。
  3. 子類必須覆蓋重寫抽象父類當中所有的抽象方法。
    覆蓋重寫(實現):子類去掉抽象方法的abstract關鍵字,然後補上方法體大括號。
  4. 創建子類對象進行使用。
public abstract class Animal {

    // 這是一個抽象方法,代表喫東西,但是具體喫什麼(大括號的內容)不確定。
    public abstract void eat();

    // 這是普通的成員方法
//    public void normalMethod() {
//
//    }

}

一個抽象類不一定含有抽象方法,
只要保證抽象方法所在的類是抽象類,即可。
這樣沒有抽象方法的抽象類,也不能直接創建對象,在一些特殊場景下有用途。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章