(关于抽象类)以下程序的输出内容是什么

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

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