昨天我遇到了一個有趣的問題,雖然修復很簡單,但我仍然對它的「原因」有些模糊。爲什麼成員對象在超類的構造函數之後初始化?
我有一個類有一個私有成員變量,當它被實例化時被分配,但是如果它被用在一個由超類的構造函數調用的抽象函數中,變量沒有值。該問題的解決方案非常簡單,我只需將變量聲明爲靜態並且它的分配正確。一些代碼來說明這個問題:
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();
它將輸出(空)而不是預期Foobar的!
由於我們實例化了一個Foo類型的對象,它的成員是否應該在調用其成員(因此它的超類)的構造函數之前不被分配和賦值?這是在Java語言的某處指定的,還是JVM特定的?
感謝您的任何見解!
小心從超類ctor調用子類方法。 – 2012-01-12 23:27:03
該代碼實際上打印fooBar!因爲'bar'變量是最終的,這使得它成爲編譯時常量。如果沒有'final',它會打印出null。 – x22 2012-01-12 23:56:33
@ x22這實際上是不正確的,是什麼引起了這種情況的調查 - 當我最初編寫它時,我相信同樣的事情。 – 2012-01-13 00:05:50