实例变量初始化的问题

u011165933 2017-07-04 10:12:47
《疯狂Java》中的这个例子不是很理解:
class Base {
private int i = 2;

public Base() {
this.display();
}

public void display() {
System.out.println(i);
}
}

class Derived extends Base {
private int i = 22;

public Derived() {
i = 222;
System.out.println(i);
}

public void display() {
System.out.println(i);
}
}

public class Demo {
public static void main(String[] args) {
new Derived(); //打印结果为0
}
}

打印结果是0,子类构造访问父类构造,父类构造中调用this.display(),实际是调用的子类Derived的display(),打印的是Derived的i,这些我能理解,不明白的地方在于这个i此时为什么是0?

我的理解:new Derived()会初始化子类,因为初始化顺序规定了成员变量初始化比构造器先执行所以先有i=22;然后执行子类构造,其中访问父类构造,调用了自身的display(),打印自己的i应当为22,为什么还是0?
...全文
253 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
soton_dolphin 2017-07-04
  • 打赏
  • 举报
回复
实际是调用的子类Derived的display(),打印的是Derived的i, 这时候 i 的初始化值为默认的0, 还没有执行到给i 赋值这一步。
u011165933 2017-07-04
  • 打赏
  • 举报
回复
引用 4 楼 u011165933 的回复:
[quote=引用 3 楼 qq_30831935 的回复:] 每个方法打个断点走一波,你就能明白执行顺序了 i是0是因为还没有走到Derived的private int i = 22;
对,执行顺序是这样的,但是我不明白的地方在于,初始化的时候不应该是先执行成员变量再是构造器吗,为什么这里先先执行了构造器中的代码?[/quote] 我自己好像明白了,查看了编译后的代码,Derived类是这样的:
class Derived extends Base
{

	int i;

	public Derived()
	{
		i = 22;
		i = 222;
	}

	public void display()
	{
		System.out.println(i);
	}
}
成员变量的初始化实质上是在放在构造器中的第二行开始,第一行默认访问父类构造,此时还没有执行i=22,因此此时i为0。
u011165933 2017-07-04
  • 打赏
  • 举报
回复
引用 3 楼 qq_30831935 的回复:
每个方法打个断点走一波,你就能明白执行顺序了 i是0是因为还没有走到Derived的private int i = 22;
对,执行顺序是这样的,但是我不明白的地方在于,初始化的时候不应该是先执行成员变量再是构造器吗,为什么这里先先执行了构造器中的代码?
鱿鱼ing 2017-07-04
  • 打赏
  • 举报
回复
每个方法打个断点走一波,你就能明白执行顺序了 i是0是因为还没有走到Derived的private int i = 22;
u011165933 2017-07-04
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:
为什么我的结果和你的不一样?? 我的结果是222
 public Derived() {
        i = 222;
      //  System.out.println(i);  //把代码粘过来的时候忘记注释掉这一行了
    }
soton_dolphin 2017-07-04
  • 打赏
  • 举报
回复
为什么我的结果和你的不一样?? 我的结果是222

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧