|
1
8
首先,由于缺少
总之,我认为您的问题在于,由于构造函数的层次结构运行方式,您的期望是无效的。
超类“constructor始终在子类之前运行”,这包括子类“变量的初始值设定项(实际上作为构造函数的一部分运行)。因此,当您创建
通常,出于这个原因从构造函数调用非最终方法是一个坏主意,许多静态分析工具都会警告您不要这样做。它类似于让对象引用在构造期间泄漏,您可以最终得到一个使类级不变量无效的实例(在您的例子中,派生的
编辑:请注意
特定的
如果没有任何附加代码,您可以通过
这实际上会满足您的需要,因为静态初始值设定项是在加载类时运行的(这必须在调用构造函数之前发生)。但是,这并不意味着:
a)类的所有实例共享相同的
在您给出的确切代码中,情况显然是这样的,但是为了简洁起见,我希望您可能省略了额外的功能。 我在这里把它包括在比较和兴趣中,不是因为它是一个解决这个“问题”的通用方法(因为它不是)。 |
|
|
2
4
返回0的原因是,在将10分配给派生中的num之前,正在调用构造函数基(并在派生中调用lookup)。 一般来说,在初始化派生实例字段之前调用基构造函数。 |
|
3
2
通常,在可以在子类中重写的构造函数中调用方法是一个坏主意。在您的示例中,会发生以下情况:
由于在基本构造函数调用lookup时子类构造函数尚未完成,因此对象尚未完全初始化,lookup返回num字段的默认值。 |
|
|
4
2
让我们慢慢来:
步骤1,在设置num=10之前,调用派生的(默认)构造函数,它链接到base的构造函数,后者调用派生的查找方法,但num尚未设置,因此val保持未初始化状态。 步骤2,调用d.value(),它属于base,val由于1而未设置,因此得到0而不是10。 |
|
|
5
2
已经有很多很好的答案了 为什么? 在构造基类时不能访问子类字段,但我认为您要求 怎样 :此类问题的有效解决方案:
实际的方法是在基类上引入init()方法,并从子类的构造函数调用它,例如:
唯一的问题是,不能强制子类调用
|
|
|
6
1
您有overriden方法
如果我正确理解了你的意图,你应该改变
|
|
|
7
1
当构造器调用此代码时,下面的代码将返回0(通过查看程序可以预期为10)。简单的原因是num尚未初始化,父类调用此方法。
|
|
|
heroxav · Rails:无法从初始值设定项创建类的对象 8 年前 |
|
|
Wagner D. F. · 不创建新实例的Java调用接口方法 8 年前 |
|
|
Nader Besada · 了解Rabbitmq 8 年前 |
|
|
Mohamed · 在java中将新对象作为参数传递给另一个新对象 8 年前 |
|
|
user7345804 · 如何将计数器应用于循环中调用的多个类实例? 8 年前 |
|
|
Zedd · 交换类实例数组中的值 8 年前 |