java繼承中建構函式的特點
這段時間在準備跳槽,所以平時有時間在複習下java基礎和設計模式這塊,本人做android開發,發現java基礎真的很重要,特別是自己寫一些框架的時候,或者在看開源的專案,所以準備把java基礎看一遍,今天講講繼承這塊,繼承一般在框架或者專案重構時經常會用到,先看ExtendsDemo1.java
public class ExtendsDemo1 {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
class Zi extends Fu{
public Zi(){
System.out.println("zi structure");
}
}
class Fu{
public Fu(){
System.out.println("fu structure");
}
}
通過列印結果:
fu structure
zi structure
發現首先是父類中的建構函式先執行,然後才是子類的建構函式執行,這是為什麼呢?
其實子類的建構函式中,有一個語句沒有寫出來,就是super()
這是呼叫父類無參的建構函式,正式因為這句話才出現如上列印的結果, 這是在繼承父類中預設就呼叫的,除非子類顯示的呼叫父類的其他建構函式,否則都會預設呼叫父類無參的建構函式,那為什麼要呼叫父類的建構函式呢?
我們知道建構函式是使用者初始化的,而子類是可以使用父類中非private修飾的成員變數,如果這個變數在父類中賦值了,如果子類不呼叫父類的建構函式,那麼使用父類中的變數就是預設值,這顯然不是我們想要的,因為可能這個變數在很多子類中都使用到,而且初始化一次,就可以了,所以放到父類的建構函式最合適,這就證明了子類要去呼叫父類中的建構函式進行初始化一些資料,
如果父類中有一個帶參的建構函式呢?
比如
class Fu{
int num;
public Fu(){
System.out.println("fu structure");
}
public Fu(int num) {
this.num = num;
System.out.println("帶引數的建構函式");
}
}
如果想在子類中呼叫父類中帶引數的建構函式,就使用super語句
比如
super(4)
public class ExtendsDemo1 {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
class Zi extends Fu{
public Zi(){
super(4);
System.out.println("zi structure");
System.out.println("num="+num);
}
}
class Fu{
int num;
public Fu(){
System.out.println("fu structure");
}
public Fu(int num) {
this.num = num;
System.out.println("帶引數的建構函式");
}
}
列印結果:
帶引數的建構函式
zi structure
num=4
這就是子類顯示的呼叫父類中那個建構函式,如果呼叫了帶引數的建構函式,父類中無參的建構函式就不會執行。
而super(4);這句話就是去父類中進行初始化,把4賦值給num,然後再子類中就可以使用
注意:如果在子類中使用了this()去呼叫自己的其他建構函式,就不會呼叫父類中的建構函式,但是引數的子類建構函式會去呼叫super(),所以說父類中的建構函式至少會執行一個