Java繼承詳解


面向對象有三大特徵:封裝、繼承、多態
而繼承就是多態的基礎,可見繼承在java中有着舉足輕重的作用

1.什麼是繼承

繼承,見名知義,是父親和兒子的關係,也就是,父親有的特性,兒子也有,但是兒子在擁有父親的特性之外,也有自己的特性,說白了繼承實際上是一種共性抽取,下面舉個例子理解:
下面我們有兩個實體:
在這裏插入圖片描述
可以看到,講師的屬性有:姓名、工號,還有一個講課的方法,而助教的屬性有:姓名、工號,還有一個輔導的方法,他們兩個實體有同樣的兩個屬性:姓名、工號,於是我們可以把這兩個共同的屬性抽取出來稱爲一個新的實體員工:
在這裏插入圖片描述
這個就是共性抽取,於是在java中他們之間就產生了一種關係

員工:父類、基類、超類
講課和助教:子類、派生類

子類擁有父類的所有特性,並且子類還可以有自己的特性

2.繼承的格式

父類:
普通類定義一樣

public class 類名{
	屬性;
	方法
}

子類:

public class 子類名 extends 父類名{

}

下面用繼承實現上述案例;

員工類(父類):

public class 員工 {
    String name;
    int Id;

    public 員工(String name, int id) {//構造方法
        this.name = name;
        Id = id;
    }
}

講師類(子類):

package demo02;

public class 講師 extends 員工{//繼承員工類
    public 講師(String name, int id) {//構造方法
        super(name, id);//調用父類構造方法
    }
    public void 講課(){//自己獨有講課的特性
        System.out.println("我在講課");
    }
}

助教類(子類):

public class 助教 extends 員工{//繼承員工類
    public 助教(String name, int id) {//構造方法
        super(name, id);//調用父類構造方法
    }
    public void 輔導(){//自己獨有輔導的特性
        System.out.println("我在輔導");
    }
}

測試類:

public class demo04 {
    public static void main(String[] args) {
        講師 js = new 講師("劉德華",666456);
        助教 zj = new 助教("蔡依林",457496);
        js.講課();
        zj.輔導();
    }
}

結果:
在這裏插入圖片描述
到這裏應該明白繼承的好處了,可以大大簡化代碼,將共同的特性抽取封裝起來,並且結構更加清晰
問題1:直接訪問成員變量時,父類和子類成員變量重名怎麼辦?
回答:創建對象時,等號左邊是誰就優先用誰,沒有則向上找
示例:

public class 父類 {
    String s = "我是父類";
}
public class 子類 extends 父類{
    String s = "我是子類";
}

測試類:

public class Demo5 {
    public static void main(String[] args) {
        父類 fl = new 父類();
        子類 zl = new 子類();
        System.out.println(fl.s);
        System.out.println(zl.s);
    }
}

運行結果:
在這裏插入圖片描述
下面刪除子類屬性,保留父類屬性,測試子類對象會不會向上找:

public class 父類 {
    String s = "我是父類";
}
public class 子類 extends 父類{
 
}

測試類;

public class Demo5 {
    public static void main(String[] args) {
        子類 zl = new 子類();
        System.out.println(zl.s);
    }
}

運行結果:
在這裏插入圖片描述
問題2:間接通過成員方法訪問成員變量時,成員變量重名怎麼辦
回答:方法屬於誰,就調用誰的變量,沒有向上找
問題3:方法重名
回答:創建對象是誰就優先用誰,沒有就往上找
注意:只會向上找父類,不會向下找子類

3.重寫

概念:在繼承關係當中,方法的名稱一樣,參數列表也一樣
重寫:方法的名稱一樣,參數列表【也一樣】。覆蓋,覆寫
重載:方法的名稱一樣,參數列表【不一樣】

方法的覆蓋重寫特點:創建的是子類對象,則優先用子類方法
注意事項
1.必須保證父子類之間方法名稱相同,參數列表也相同
@override:寫在方法前面,用來檢測是不是有效的正確覆蓋重寫。(可選)
2.子類方法的放回值必須小於父類的返回返回範圍
小擴展提示:java.lang.object類是所有類的公共最高類(祖宗類),java.lang.String就是object的子類
3.子類方法的權限必須【大於等於】父類方法的權限修飾符
小擴展提示:public > pratected > (defuult) > private
備註:(default)不是關鍵字default,而是什麼都不寫,留空

4.繼承中構造方法訪問特點

1.子類構造方法中有一個默認“super()”調用,所以一定先調用的父類構造,後執行的子類構造
2.可以通過super關鍵字來子類構造調用父類重載構造
3.super的父類構造調用,必須是子類構造方法的第一個語句,不能一個子類構造調 用多次super構造
總結:子類必須調用父類構造方法,不寫則贈送super();寫了則用寫的指定的super調用

5.JAVA繼承的特點

java語言是單繼承的:一個類的直接父類只能有一個
Java語言可以多級繼承
Java語言父類可以有多個子類

6.super關鍵字的三種用法

1.在子類的成員方法中訪問父類的成員變量 super.父類成員變量
2.在子類的成員方法中訪問父類的成員方法 super.父類成員方法
3.在子類的構造方法中訪問父類的構造方法 super();

7.this關鍵字的三種用法

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

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