Java 执行对象构造函数理解

今天无意在论坛中看到帖子 地址:http://bbs.csdn.net/topics/390457086?page=1#post-394480008

然后自己想说一下自己对这个问题的理解,不知道是否正确欢迎大家拍砖。

先看代码,这里我直接粘贴帖子中的代码。

public class A {
public A() {
init();
}
 
protected void init() {
 
}
 
public void print() {
System.out.print("1");
}
}

public class B extends A{
private String b1=null;
protected void init() {
this.b1 = "0";
print();
}
public void print() {
// TODO Auto-generated method stub
System.out.print(b1);
}
        public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();//输出0
a.print();//输出null?
}
 
}

大家把代码拷贝到IDE运行一下,如果你能很清楚的知道为什么会输出‘0’,null这样的结果。

那么我可以肯定 的说你java基础很扎实。如果不是,那么我建立你好好回去温习一下以前学的基础知识。

为什么会输出这样结果呢?

输出‘0’,估计大家基本上都知道。

1,在new B()的时候会隐式的调用其父类A的构造函数。

2,在A中会将变量this.b1赋值为0,并打印出来。

3,然后这时候会初始化B中的成员变量。此时b1变量是null。所以会打印null.

为什么会是这样呢?

这个和java构造函数执行的顺序有关系。

1,进入B的构造函数,给B的成员变量分配空间。(只是分配空间,没有初始化)。

2,隐式调用父类A的的构造函数。super().

3,给B类成员变量初始化。(这时会将成员变量初始化,引用类型默认null,整型默认0)。

4,执行B的构造函数体代码。

可以参考:http://www.ehelper.com.cn/blog/post/40.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值