(關於抽象類)以下程序的輸出內容是什麼

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

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