张帅 发表于 2011-12-20 13:16
对,我的疑问就在这里,在父类的构造函数里,给变量 i 赋值,应该是给父类的 变量 i 赋值吧? ...
如果没有子类继承该父类,那就不存在new子类实例这么一说。那你可以认为是在父类中对成员变量i赋值。但是如果有子类,并且调用子类构造函数了,由于java对象创建时初始化具有需要先调用父类构造器的这个特点。程序在运行时的this指向就是子类了。和编译时的指向不是一回事。所以在这个例子中给变量i赋值实际上是在给子类中从父类继承来的那个i赋值。如果你调用的是new Parent(),那么代码中的i赋值语句就肯定是给父类中的赋值。因为就是他自己在调用自己的构造器嘛。
所以说到底的话:要弄明白编译时的this指向和运行时的this指向到底是怎么回事!
通常不会在父类构造函数中调用会被子类重写的方法。有可能引发错误,有时候这个错误是很危险的。 |