【发布时间】:2012-02-09 06:11:55
【问题描述】:
我昨天遇到了一个有趣的问题,虽然修复很简单,但我仍然对它的“原因”有点模糊。
我有一个类,它有一个在实例化时分配的私有成员变量,但是如果它用于由超类的构造函数调用的抽象函数中,则该变量没有值。问题的解决方案非常简单,我只需将变量声明为 static 并正确分配它。一些代码来说明问题:
class Foo extends BaseClass
{
private final String bar = "fooBar!";
public Foo()
{
super();
}
@Override
public void initialize()
{
System.out.println(bar);
}
}
还有基类:
abstract class BaseClass
{
public BaseClass()
{
initialize();
}
public abstract void initialize();
}
在这个例子中,当我们调用 new Foo(); 时,它会输出 (null) 而不是预期的 fooBar!
既然我们实例化了一个 Foo 类型的对象,在调用它的(以及它的超类的)构造函数之前不应该分配和分配它的成员吗?这是在 Java 语言中的某个地方指定的还是特定于 JVM 的?
感谢您的任何见解!
【问题讨论】:
-
警惕从超类ctor调用子类方法。
-
代码实际上打印了fooBar!因为
bar变量是最终的,这使它成为编译时常量。如果没有final,它将打印 null。 -
@x22 这实际上是不正确的,是什么导致了调查这种情况 - 我最初写它时也相信同样的事情。
标签: java