Java關於抽象類的相關約定爲:抽象類一定存在構造方法,子類也一定遵循對象實例化流程。先調用父類構造,再調用子類構造
那麼以下程序的輸出內容是什麼
abstract class A{
public A(){ //2
this.print();//3
}
public abstract void print();
}
class B extends A{ //1
private int num = 100;
public B(int num){
this.num = num;
}
@Override
public void print() {//3
System.out.println(this.num);//4
}
}
public class Test1 {
public static void main(String[] args) {
new B(30);//1
}
}
此程序的輸出內容爲 0
原因如下:
Java實例化對象的過程爲:先加載類,再開闢堆空間(此時所有東西已經有默認值),再調用構造方法,然後進行屬性初始化,賦值等操作
對於以上程序的執行步驟在相應的程序語句後面已經標明,可以看到在第4步時已經開闢了堆空間,已經給num賦默認值0了,輸出的時候還沒有進入B的構造方法,所以輸出0
那麼將以上程序進行修改:
若修改以上程序的倒數第三行 爲:
new B(30).print();
此時輸出30,因爲已經產生B類的對象,則B的構造方法已經執行,所以輸出30