2016-07-20 4 views
-3

プリントを使用することはできません、ファイル名がExample.java静的な入れ子になったクラスは、私は、静的な入れ子になったクラスStatClassを持って

最初のprintln文はすなわち静的ネストされたクラスでは動作しません
class OuterClass 
{ 
    public static class StatClass 
    { 
     System.out.println("Hello"); // This line doesn't work 
     void pow() 
     { System.out.println("Hello W");} 
    }  
} 
public class Example 
{ 
    public static void main(String[] args) 
    { 
    OuterClass.StatClass statInner1 = new OuterClass.StatClass(); 
    statInner1.pow();  
    } 
} 

そのが削除した場合でありますPOW()メソッドの内部で、理解できなかったときのprintln文は動作しますが、プログラムは、コンパイルこの

+6

"この行は機能しません"というのは、メソッド外のステートメントだからです。 –

+0

ヒント:「内部クラス」を扱う前に、基本的な基本を実際にカバーしたいことがあります。 – GhostCat

+0

より正確に言うと、ブロック*の外側の文です。 –

答えて

4

通常のクラスでは、あなただけのクラス内の文を置くことができないと同様。

{ 
    System.out.println("Hello"); 
} 

コンストラクタまたはメソッドで、次のようにイニシャライザブロックに配置できます。あなたが望むものなら、なんでも。声明に続き

+0

ありがとう、非常に簡潔で、私の質問から離れていくつかの他のものもクリアしました。 – Cloverr

1

私はちょうど今のところ2つの答えを統合しています:

一つの選択肢は、静的ブロック

です
class OuterClass 
{ 
    public static class StatClass 
    { 
     static { 
     System.out.println("Hello"); // This line doesn't work 
     } 
     void pow() 
     { System.out.println("Hello W");} 
    }  
} 
public class Example 
{ 
    public static void main(String[] args) 
    { 
    OuterClass.StatClass statInner1 = new OuterClass.StatClass(); 
    statInner1.pow();  
    OuterClass.StatClass statInner2 = new OuterClass.StatClass(); 
    statInner2.pow(); 
    } 
} 

主な違いは、ブロックがJVMによってどのように実行されるかです。最初のケースでは、クラスの初期化中に1回実行されます。出力は次のようになります

ハロー ハローWハローW

別のオプションは、コードは、クラスの各インスタンスで実行される場合、初期化ブロックです。

class OuterClass 
{ 
    public static class StatClass 
    { 
    { 
     System.out.println("Hello"); // This line doesn't work 
     } 
     void pow() 
     { System.out.println("Hello W");} 
    }  
} 
public class Example 
{ 
    public static void main(String[] args) 
    { 
    OuterClass.StatClass statInner1 = new OuterClass.StatClass(); 
    statInner1.pow();  
    OuterClass.StatClass statInner2 = new OuterClass.StatClass(); 
    statInner2.pow(); 
    } 
} 

その後、出力は次のようになります。

こんにちはこんにちはこんにちはこんにちはW W

+0

これは "静的ブロック"ではありません。インスタンス初期化子です。 –

+0

これは静的です。 –

+1

しかし、スタティックブロックでラップする必要はありません。インスタンスイニシャライザも機能します。 –

0

は文句を言わないあなたはJVMは、静的インスタンスを作成するときに、このブロックが実行されます

static{ 
    System.out.println("Hello"); // This line will work 
} 

次のように静的ブロック内のこれらのステートメントをラップする必要があり

System.out.println("Hello"); // This line doesn't work 

仕事外の方法です。

+0

"次のように静的ブロックを使用する必要があります"いいえ、そうではありません。要件に応じて、他のオプションも存在します。 「JVMが静的インスタンスを作成するとき」JVMは「静的インスタンス」を作成しません。 –

+0

1:実行時に、JVMが静的ブロックまたは静的属性を参照すると、静的属性すべてにメモリが割り当てられ、ブロックされます。それは最初から実行され、そのクラスのすべてのインスタンスとともに返されます。 2:JVMがいない場合は誰ですか? ここで何が間違っていますか? –

+0

1.しかし、スタティックブロックを使う必要はありません。 2.「静的インスタンス」のようなものはありません。JVMは、クラスがロードされたときに静的ブロックを実行します。 –

0
System.out.println("Hello"); 

コントロールが行に移動しないため、これは機能しません。これを関数の中で定義し、それを呼び出すために作成したオブジェクトを使用しないか、オブジェクトを呼び出すためにオブジェクトを必要としないスタティックブロックを使用するか、イニシャライザブロックを使用しない限り、動作しません。私は助けてくれることを願っています

関連する問題