天天看點

繼承

基本概念

  • 擴充一個類已有的功能

優點

  • 父類定義公共的内容,友善統一修改
  • 整體減少代碼量
  • 添加新類友善

文法

class 子類 extends 父類{}
           
  • 子類又叫派生類
  • 父類又叫超類,super(class)

在一個子類繼承時,實際上會繼承父類中的所有操作,對于所有的非私有(no private)操作屬于顯式繼承(可以直接利用對象操作),而所有的私有操作屬于隐式繼承(間接完成)利用get/set方法間接操作

子類構造和父類構造

  • 預設情況下,子類會找到父類中的無參構造方法
    public class Hero{
        public Hero(){
            System.out.println("父類無參構造");
        }
    }
    
    public class Worrior extends Hero{
        public Worrior(){
            System.out.println("子類無參構造");
        }
        public static void main(String args[]){
            Worrior worrior = new Worrior();//執行個體化子類對象
        }
    }
               
    列印結果:

    父類無參構造

    子類無參構造

  • 子類執行個體化時會預設執行父類構造,調用父類構造方法,然後再執行個體化子類對象,調用子類的構造方法,其實相當于在子類構造隐藏了一個super();
    public class Worrior extends Hero{
        public Worrior(){
            super();//調用父類構造
            System.out.println("子類無參構造");
        }
               
    如果父類沒有無參構造,則子類必須通過super()調用指定參數的構造方法
    public class Hero{
        private String nickName;
        public Hero(String nickName){
            this.setNickName(nickName);
            System.out.println("父類無參構造");
        }
    }
    
    public class Worrior extends Hero{
        public Worrior(){
            super("英雄名字");//調用父類對應的參數構造
            System.out.println("子類無參構造");
        }
        public static void main(String args[]){
            Worrior worrior = new Worrior();//執行個體化子類對象
        }
    }
               
    構造方法的執行順序是按照繼承順序來執行的

    小結

    • 使用super關鍵字來調用父類構造方法
    • 預設會先調用父類構造,再調用子類構造
    • 構造方法不可繼承
    • Java中隻能繼承一個父類
    • 父類私有屬性在子類中不能直接通路(需通過get/set方法間接通路)
    • 繼承關系是一種“- is - a -”關系,父類和子類之間必須存在is - a 關系

方法重寫

當子類定義了和父類方法名稱相同,傳回值類型,參數類型和個數完全相同的方法的時候,叫做方法的重寫

當在一個類中的方法被重寫後,如果執行個體化的是這個子類對象,則調用的方法就是被重寫過的方法

注意:
> 方法重寫發生在通過繼承而相關的不同類中
> 方法重寫具有同樣的方法簽名和傳回值類型
> @override 稱為重寫标注,用來保證重寫的方法與原方法的前面和傳回值類型一緻
           

被子類重寫的方法不能擁有比父類更嚴格的通路控制權限,(private < default(不寫) < public)

當一個子類重寫一個父類的方法時,想要調用父類重寫的方法時,就得在方法前加上super

super.方法();
           
注意:
> this.方法();先從本類查找是否存在指定的方法,如果沒有再調用父類操作
> super.方法();直接由子類從父類中調用指定的方法,不再找子類
           

重寫的應用

Java中所有類都繼承于java.lang.Object類,如果定義類沒有顯式指明父類,父類預設為object

Object類可以接收所有類的執行個體化對象

public class Hero{
    public static void main(String[] args){
        Object obj = new Hero();
        Hero hero = (Hero) obj;
    }
}
           

常用的需要重寫的Object類中的三個方法:

> 取得對象資訊:
public String toString();

> 對象比較:
public boolean equals(Object obj);

> 取得哈希碼:
public int hashCode();