2012-03-24 21 views
1

を拡張I'am 2つのクラスは、単一のクラスファイルにコンパイルされている初期化ブロック初期化ブロックは、ここで

class Father{ 
Father() { 
    System.out.println("Father constructor runs..."); 
} 
static {System.out.println("static init block of Father...");} 
{System.out.println("instance init block of Father...");} 
} 

class Child extends Father { 
Child() { 
    System.out.println("Child constructor runs..."); 
} 
static {System.out.println("static init block of Child ...");} 
{System.out.println("instance init block of Child ...");} 
public static void main (String[] argv) { 
    new Child(); 
} 

}

と自信を取って自分のコードスニペットです:Child.class 私は実行

static init block of Father... 
static init block of Child ... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 
:コマンドラインのjava子供を持つことは

これが私の出力に含まです

"静的initブロックof Child ..."が2回印刷されていることを除いて、この出力でうまくいきます。 Javaのドキュメントから、「静的initブロックは、クラスが最初にロードされたときに実行されます。

これは、私のクラスのChildが2回ロードされたことを意味しますか?

すべてのヘルプを再現する アルベルト

+2

これを試してみました。「静的initブロックの子」は、OpenJDK Runtime Environment(IcedTea6 1.9.13)(6b20-1.9.13-0ubuntu1〜10.10.1)を使用して)一度だけ印刷されました。このコードでメッセージを2回受け取ってもよろしいですか? – esaj

答えて

2

はできません 感謝感謝される - ここで私は、コマンドラインからそれを実行することによって、あなたのコードから取得する出力です:

static init block of Father... 
static init block of Child ... 
instance init block of Father... 
Father constructor runs... 
instance init block of Child ... 
Child constructor runs... 

あなたはどのように言っていませんコードを実行していますが、私はのいずれかがと出力が実際には違うと思っているのですか、それとも奇妙な方法で実行しています。

期待通りです。静的イニシャライザブロックは1回だけ実行する必要があります。

+0

実際には私の予期しない出力の問題は、別の子クラス(上のものとは異なる)がクラスパスに存在するという事実に関連しています。私は、この他の子クラスがどのように出力に干渉するのかをまだよく理解していませんでした。この他の子クラスを削除すると、予期しない出力が解決されます。 –

関連する問題