2016-09-16 4 views
5
で静的変数の初期化に
public class InstanceBuilder { 

    private static final InstanceBuilder INSTANCE = new InstanceBuilder(); 

    private static String name = null; 

    private InstanceBuilder() { 
     System.out.println("Setting cons()"); 
     name = "Testing"; 
    } 

    public static String getName() { 
     return name; 
    } 
} 

public class Driver { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     System.out.println("value is " + InstanceBuilder.getName()); 
    } 

} 

出力を理解します。コンストラクタで印刷しようとするとTestingが印刷されますが、public staticメソッドから呼び出すとnullとなります。私はそれをINSTANCE.nameに変更すれば分かります。 しかし、同じコピーを共有する必要があるため、static変数に直接アクセスすると、なぜ機能しないのか理解したいと思います。 ここには何が欠けていますか?は、Java

答えて

8

名前の値が、宣言の順序に従ってコンストラクタ呼び出しの後に変更されるためです。

は何が起こっているかを見てみましょう:

1)あなたはInstanceBuilder.getName()を呼び出すと、InstanceBuilderクラスがロードされつつあります。そのプロセスの一部として、INSTANCEnameインスタンス変数が初期化されています。 INSTANCEを初期化中

2)、InstanceBuilderクラスの

private static final InstanceBuilder INSTANCE = new InstanceBuilder(); 

コンストラクタは、& Setting cons()文が印刷されつつあり、name変数はTestingで初期化されて呼び出さなっています。

3)次name再びにより以下のステートメントにnullで再初期化されつつある

private static String name = null

したがって、メソッド呼び出しがDriverクラスに戻るとき、nameの値はnullとなり、nullが出力されます。したがって、namestaticと宣言されていますが、staticはそのコンテキストでは役割を持ちません。

注:

は、クラスメンバーは静的初期化は、順番にその宣言通り を発生するため、値がnullである。ここ

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#1852

+0

静的変数の実行順序のbeacuse疑問に – Kars

0

を宣言する必要がありますそのために、下記のリンクをチェックだから最初にあなたの

`private static final InstanceBuilder INSTANCE = new InstanceBuilder();` 

coデは、最終的な値はnullになり、(静的変数としてのみクラスごとcoppyを有する)、あなたの

`private static String name = null;` 

コードexceuteとオーバライド値をnullに、実行し、値が「テスト」に割り当てます。私はあなたの、について説明から間違っていたところ

は、だからここに、この動作は、ちょうど

+0

感謝をクリアするためのおかげで、それを手に入れています。 – Kars