2017-02-21 3 views
-4
public class Demo{ 
    Map<String,String> test = new HashMap<String,String>(); 
    test.put("A","A"); 
    System.out.println(test); 

} 

なぜこのコードでput機能が許可されていませんか?マップのputメソッドがクラス内で直接呼び出されているのはなぜですか?

+2

。 – Eran

+0

最後の2行は、インスタンスメソッド/コンストラクタ/インスタンス初期化子に入れない限りコンパイルされません。 – Andrew

+0

SO –

答えて

2

あなたは中括弧に入れて、オブジェクトの初期化の一環として、いくつかのコードを実行したい場合:

public class Demo{ 
    Map<String,String> test = new HashMap<String,String>(); 

    { // This is now part of object initialization 
     test.put("A","A"); 
     System.out.println(test); 
    } 
} 

put、または任意の他のメソッド呼び出しを、Javaのため、クラス宣言セクション内許可されていませんこのコードをいつ実行するかはわかりません。この言語には、実行可能コードの実行に関する特定の規則があります。これは、メソッド呼び出しの一部、またはオブジェクトまたはクラスの初期化のいずれかです。

中括弧内のコードは、オブジェクトの初期化の一部になります。 Demo d = new Demo()を実行すると、testマップには{"A", "A"}が挿入され、マップ自体が印刷されます。印刷物がかわいいというわけではないことに注意してください。詳細については、this Q&Aを参照してください。

+0

私はこの2行がうまくいかないことを知っていますが、なぜそれがうまくいかないのか知りたかっただけです。 –

+0

答えをありがとう。 –

+1

注:OPには依然としてメインの方法が必要です。 –

0

これはJavaの仕組みではありません。クラスがロードされたときにこのputを達成したい場合は、staticブロックを試してみてください。

public class Demo{ 
    static Map<String,String> test = new HashMap<String,String>(); 
    static{ 
     test.put("A","A"); 
     System.out.println(test); 
    } 
} 

またはあなたはそれがすべてのオブジェクトの作成と初期化したい場合は、適切なコンストラクタまたは単にデフォルトの実行ブロックに保管してください(staticに似てますが、staticキーワードなし)。

public class Demo{ 
    Map<String,String> test = new HashMap<String,String>(); 
    public Demo(){ 
     test.put("A","A"); 
     System.out.println(test); 
    } 
} 
+0

'test'は静的ではないため、最初の例はコンパイルされません。おかげさまで –

+0

ありがとうございます。ちょうどそれを固定した。 –

+0

文のブロックは 'static'文脈に限定されません。だから、 'Map test'をインスタンス変数として持つことができました – AxelH

0

クラスに何かを実行するには、それ自体が何かを保持しているクラスのメソッドを定義する必要があります。

あなたがやった: クラス - > 何か正しい

: クラス - >メソッド - >何かあなたが方法でそのコードを置く必要があります

+0

私は何かを保持する方法が必要であることを知っているこの事、私の主な質問は、なぜメソッドの保持が必要ですか? –

関連する問題