考虑以下Java类声明:
public class Test {
private final int defaultValue = 10;
private int var;
public Test() {
this(defaultValue); // <-- Compiler error: cannot reference defaultValue before supertype constructor has been called.
}
public Test(int i) {
var = i;
}
}
该代码将无法编译,编译器会抱怨上面我突出显示的那一行。为什么会发生此错误,最好的解决方法是什么?
之所以无法最初编译代码,是因为该类defaultValue
是一个
实例变量Test
,这意味着在Test
创建类型的对象时,defaultValue
还将创建的唯一实例并将其附加到该特定对象。因此,无法defaultValue
在构造函数中进行引用,因为尚未创建引用,也没有创建对象。
解决方案是使最终变量static
:
public class Test {
private static final int defaultValue = 10;
private int var;
public Test() {
this(defaultValue);
}
public Test(int i) {
var = i;
}
}
通过创建变量static
,它变得与类本身相关联,而不是与该类的实例相关联,并且在的所有实例之间共享Test
。JVM首次加载类时会创建静态变量。由于在使用类创建实例时已经加载了该类,因此可以使用静态变量,因此可以在该类中使用它,包括构造函数。
问题内容: 为什么此代码无法编译? 如果进行以下任一更改,则编译成功: 是私人的而不是公共的 第7行读取,而不是 使用Javac版本:1.6.0_20 问题答案: 应该注意的是,Eclipse 和Intellij IDEA在这些代码片段方面表现出不同的行为。和 Java的谜题 行为被用于讨论参考。 我可以将代码段缩减为以下内容: 在 Java Puzzlers , Puzzle 90中 讨论了这种
问题内容: 有没有在Java构造函数中使用最终变量的解决方案?问题是,如果我初始化一个最终字段,例如: 那么我就不能在构造函数中使用它。Java首先运行构造函数,然后运行字段。有没有一种解决方案可以让我访问构造函数中的final字段? 问题答案: 我不太明白你的问题。那 执行如下:
问题内容: 我有一个类A,并写了一个子类B。A只有一个参数化的构造函数。B必须调用A的这个超级构造函数。现在,我想使用一个Object作为参数。该对象应调用B的方法。因此,参数对象必须持有B的引用,或者必须是内部类。 现在,当我想调用构造函数时,……Eclipse说: 在显式调用构造函数时无法引用“ this”或“ super” 我唯一想解决的是设置方法,将“ this”实例注入到参数对象中。我不
为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。
问题内容: 如果我有一个像这样的构造函数: 然后,我如何在与构造函数相同的类中的方法中使用变量c和d,因为尝试仅在方法中使用变量名似乎不起作用? 问题答案: 实际上,您的代码将无法编译- 无效。 我认为您的意思是:- 。 然后我如何在与构造函数相同的类中的方法中使用变量c和d 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。
例如, 这将引入编译错误“调用构造函数时无法引用实例字段”。 StackOverflow中有关此场景的类似问题的一些答案转到“因为当前实例仍在构建中”或“堆中尚未创建的实例”。 然而,令人困惑的是,在超类构造函数中,可以调用可重写的成员方法,这些方法可能访问子类当前实例的字段。在Java也没问题。 我的问题是 > 在实例构造过程中,子类的字段从哪一刻开始可以引用? “在调用构造函数时不能引用实例字