繼承的基本概念
- 子類可以擁有父類的“內容”
- 子類還可以擁有自己專有的內容
- 繼承是多態的前提,如果沒有繼承,就沒有多態
特點
- Java語言都是單繼承的:一個類的直接父類只能有唯一一個。
- Java語言可以多級繼承。
- 一個子類的直接父類是惟一的,但是父類可以擁有很多個子類。
- 定義父類的格式:(一個普通類的定義):
public class Fu {
// ...
}
- 定義子類的格式:(一個普通類的定義):
public class Zi extends Fu {
// ... //子類繼承父類,會繼承父類中方法,成員變量
}
- 繼承中成員變量的訪問特點:
在父子類的繼承關係當中,如果成員變量重名,則創建子類對象時,訪問有兩種方式:
-
直接通過子類對象訪問成員變量:
等號左邊是誰,就優先用誰,沒有則向上找。 -
間接通過成員方法訪間成員變量
該方法屬於誰,就優先用誰,沒有則向上找。
public static void main(String[] args) {
Fu fu=new Fu(); //實例化父類
Zi zi=new Zi(); //實例化子類
//這個方法是在子類中定義的,優先使用子類的,沒有則往上找
zi.methodZi(); //輸出爲200
//這個方法是在父類中定義的
zi.methodFu(); //輸出爲100
}
//父類
public class Fu {
int numFu=10;
int num=100;
public void methodFu(){
System.out.println(num);
}
public Fu(){
system.out.println("父類無參構造");
}
public Fu(int num){
system.out.println("父類有參構造");
}
}
//子類
public class Zi extends Fu {
int numZi=10;
int num=200;
public void methodZi(){
System.out.println(num);
int num=300;
}
}
- 區分子類方法中重名的三種變量:
- 局部變量: 直接寫成員變量名
- 本類的成員變量: this.成員變量名
- 父類的成員變量: super.成員變量名
public void methodZi(){
int num=300;
System.out.println(num); //300,局部變量
System.out.println(this.num); //200,本類的成員變量
System.out.println(super.num); //100,父類的成員變量
}
- 繼承中成員方法的訪問特點:
- 如果父類和子類中方法重名,則:創建的對象是誰,就優先用誰,如果沒有則向上找。
- 無論是成員方法還是成員變量,如果沒有都是向上找父類,絕不會向下找子類的。
- 繼承中構造方法的訪問特點:
- 子類構造方法當中有一個默認隱含的“ super()調用,所以一定是先調用的父類構造,後執行的子類構造。
public Zi(){
super(); //調用父類無參構造方法,程序自動隱藏生成,不用寫
system.out.println("子類構造方法")
}
- 子類構造可以通過 super關鍵字來調用父類重載構造。
- super的父類構造調用,必須是子類構造方法的第一個語句。不能一個子類構造調用多次 super構造
public Zi(){
super(num:20); //調用父類有參構造方法
system.out.println("子類構造方法")
}
- 只有子類構造方法才能調用父類構造方法
總結:
子類必須調用父類構造方法,不寫則贈送 super();寫了則用寫的指定的 super調用,supe只能有一個,還必須是第一個。