3 回答
TA贡献2051条经验 获得超10个赞
对象构建的顺序是:
变量声明和初始化
实例构造函数块
constructor
如果一个类有父类,则在实际类之前先为父类完成相同的顺序。
父母第一
整数 = 9
首先评估,num
设置为 9(父母的 1)
父构造函数代码...9
实例初始化块在构造函数(父类的 2.)之前执行
父构造函数运行
构造函数被调用(parent's 3.)
儿童节目...0
Parent
调用的构造函数show()
。show()
被覆盖,因此Child
调用了。
孩子的 1. 和 2. 还没有被调用,因此 overriding num
inChild
仍然是 0。*1
然后孩子
整数 = 8
Child
1. 被评估
子构造函数代码...8
Child
的 2.num
在此之后设置为 10。
子构造函数运行
Child
的 3。
儿童节目...10
Child
的构造函数调用show()
。
*1:
这就是为什么final
在构造函数中调用非方法是非常危险的。方法往往依赖于被初始化的成员变量;他们不是在这一点上。
NullPointerException
如果这是一个非原始变量,如果您的方法试图访问它,您很可能会遇到 a 。
TA贡献1852条经验 获得超1个赞
当 java 创建一个子类时,它必须调用super()
初始化父类——这样它就可以在超类或其他活动中实例化私有字段。(这不会创建父类的对象。)这就是您看到的原因Parent constructor code...9
- 它正在调用父代码,并打印父类的num
.
因为您创建了一个子类,所以在父构造函数中show()
调用了子类。这就是为什么在构造函数中调用非 final 方法是危险的——如果子对象覆盖了它们,则将调用子对象的方法。
孩子的num
是 0 因为Java 将成员变量初始化为默认值,而您的代码还没有机会将其设置为 10。
至于你的子代码,它num
没有被覆盖,它被隐藏了——只有方法可以被覆盖。这就是为什么您的孩子show()
在正确初始化后将其显示为 10 的原因。如果你想访问父变量,你可以用 来实现super.num
,但这通常被认为是不好的做法,因为它会引起混淆。
添加回答
举报