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