2016-05-19 34 views
5

私は以下のコードの出力と混同しています。私は、最初の静的ブロックがクラスのロードの後に​​実行されることを知っていますが、なぜ私のクラスTest6はロードされていません。誰かが明確にしてください。私のクラスが読み込まれない理由

package com.vikash.General; 

public class Test5 { 

    public static void main(String[] args) { 
     System.out.println(Test6.FOO); 
    } 
    static { 
     System.out.println("Initializing B"); 
    } 
} 
class Test6{ 

    public static final String FOO = "foo"; 
    static { 
     System.out.println("Initializing A"); 
    } 
} 
+0

私はo/pを取得しています。 foo –

答えて

0

あなたが希望する出力

Class.forName("<package>.Test6"); 
+0

「クラス foo = Test6.class」だけではないのはなぜですか? – Thilo

+1

何かが動作します。 OPがクラスローディング問題について混乱したので、私はそれを与えたばかりです。 – Helios

+0

'System.out.println(Test6.FOO)'のような式は、通常はクラスをロードします(この場合はそうではありません)。 – Thilo

2

を取得することは、コンパイラが"foo"リテラル文字列への参照をインライン化されたためと考えられるので、JREが実際にロードを気にしないクラスローダを使用しますそれを得るためにTest6

public static final String FOO = new String("foo"); 

は、クラス Test6がロードされるん(およびその staticブロックが実行されます):あなたのような変更を行う場合は

+0

'FOO'がfinalでないときにもリテラルで動作します。しかし、そうしなければならない場合は、あなたのソリューションも同様に機能します。 – Clayn

9

Test6.FOOTest6を指しますが、フィールドがコンパイル時定数で初期化public static final Stringですのでwill be inlined by the compiler、およびTest6は、すべての時にロードする必要はありません。

+0

確かに。 'final'を削除すると、静的イニシャライザが呼び出されます。 – Clayn

+0

@Thilo「コンパイラによってインライン展開されます」と説明できますか?私は理解できない。これは私には新しくありません – mubeen

+1

実際には、コードは 'System.out.println(" foo ")'になります。コンパイラは、フィールドへの参照を文字列リテラルに置き換えます。実行時に、このコード行に 'Test6'は必要ありません。 – Thilo

-3

Test6は初期化されていません。

fooは静的です。つまり、クラスが初期化される前、およびクラスが読み込まれる前に使用できます。

+3

私はこの回答を完全に理解しているかどうかはわかりませんが、間違っていると確信しています。 – SomeJavaGuy

+0

あなたが理解していないなら、なぜそれが間違っていると確信していますか? – sotondolphin

+0

なぜ 'Test6'がロードされないのか説明できないためです。これはちょうど 'foo is static'の混乱した説明に従います。これは現時点では動作と無関係です。実際には 'foo'を' static'と呼んでいるにもかかわらず、 'Test6'を読み込んで静的初期化子ブロックを呼び出さないのですか? – SomeJavaGuy

関連する問題