一个让98%的Java程序员犯难的偏门问题!

本文探讨了一个关于Java中构造函数调用顺序及实例变量初始化时机的问题。通过具体代码示例,解析了父类构造函数如何调用子类被覆盖的方法,并解释了为何子类实例变量在构造过程中未按预期初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在csdn的张孝祥专栏(http://blog.youkuaiyun.com/zhangxiaoxiang/archive/2006/08/15/1066757.aspx)上看到张老师出的一道题目,说是会让98%的Java程序员犯难的偏门问题!!
当然,实际上哪有那么夸张,张老师也太低估搞java的了,而且这道题目怎么看我都好象在TIJ中看到过。。。但题目中还是有些细节值得学习学习地。。。

问题:

None.gif public class Parent
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
publicvoidtest()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
publicParent()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.giftest();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
publicstaticvoidmain(String[]args)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
newChild();
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif
class Child extends Parent
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
privateintinstanceValue=20;
InBlock.gif
publicvoidtest()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSystem.out.println(
"instancevalueis:"+instanceValue);
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif


各位先猜猜打印的结果是多少呢?为什么呢?
在下面的回复中,我认为这种答案应该是正确的:
None.gif 当实例化Child时( new Child()),
None.gif会调用父类(Parent)的Constructor(构造函数).
None.gif而在Parent的constructor中又调用的test()方法,
None.gif此方法被子类ChildOverride了,所以那时会调用
None.gif子类的test()方法,而调用的时候,子类的实例化
None.gif还没有结束,其instancevariableinstanceValue还没有被赋值
None.gif为20,而int类型的默认值为0。
None.gif因此打印的结果应该是0,而不是20。

这题目确实不难,但有两点引起我的思考:
(1)我在做这题目的时候,在new Child()时居然错误地认为,会先去调用Child类默认的构造函数,而实际上是:当创建派生类的对象时,系统将会调用基类的构造函数和派生类的构造函数,构造函数的执行次序是:先执行基类的构造函数,再执行派生类的构造函数。如果派生类又有对象成员,则,先执行基类的构造函数,再执行成员对象类的构造函数,最后执行派生类的构造函数。
(2)instanceValue 这个变量是不会被赋值20的,但如果题目改为 private static int instanceValue = 20;那答案就应该是20了,因为在编译前就会赋20给这个变量。

当然,还是等张老师公布正确答案吧,拭目以待。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值