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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值