面向對象有三大特徵:封裝、繼承、多態
而繼承就是多態的基礎,可見繼承在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兩種構造調用,不能同時使用