2017-09-16 15 views
1

私はJavaで静的クラスを学んでいます。以下のコードで を実行したところ、起動時にstaticClassコンストラクターが既に初期化されていると仮定しました。そうではありません。デバッグカーソルがメインメソッドの最初のforループのブレークポイントに達すると、 "staticClassがロードされていません"というエラーが表示されます。静的クラスがロードされていません

質問:mainメソッドを実行する前に静的クラスコンストラクタを実行する方法はありますか?なぜロードされていないのでしょうか?同様の静的クラスが起動時にC#でロードされます。しかし、Javaで?これが動作していないコードであると考えてください。 Javaの専門家として、このコードをどのように書き直すことができましたか?修正する必要があります。

public class Main { 

    public static class staticClass 
    { 
     public static int myArray[]; 

     public staticClass() 
     { 
      myArray=new int[10]; 
     } 

     public static int NextUnique() 
     { 
      int r=(int)(Math.random()*10); 
      return r; 
     } 
    } 
    //=new int[10]; 
    public static void main(String[] args) throws ClassNotFoundException { 

     for (int i=0;i<staticClass.myArray.length;i++) 
      staticClass.myArray[i]= staticClass.NextUnique(); 

     for(int i=0;i<staticClass.myArray.length;i++) { 
      String msg= MessageFormat.format("{0}. value= {1}",i,staticClass.myArray[i]); 
      System.out.println(msg); 
     } 
    } 
} 
+0

ネストされたクラスは、別のクラスにネストされ、そのクラスのプライベートメンバーにアクセスできるという点を除いて、tpレベルのクラスと似ています。他のクラスと同様に動作します。したがって、そのコンストラクタは決してどこにも呼び出さなければ魔法のように呼び出されません。 –

+0

私は別のクラスにクラスを埋め込むことはしませんが、これはjavaの唯一の方法だと思います。静的クラスは単独でもネストされなくてもかまいませんか? –

+0

もちろん、静的キーワードは必要ありません。 Mainクラスのようにトップレベルのクラスになります。私はあなたが「それは唯一の方法だ」という言い方を確信していません。何をする唯一の方法は? –

答えて

1

あなたは、この目的のために静的な静的初期化ブロック(コンストラクタ)を使用する必要があります。今の代わりに

public staticClass() 
    { 
     myArray=new int[10]; 
    } 

使用

static 
    { 
     myArray=new int[10]; 
    } 

あなたのコンストラクタは、インスタンスコンストラクタです。新しい演算子を使用するたびに動作します。 static constructor in c#static initialization block (constructor) java

+0

静的なコンストラクタではありません。静的な初期化ブロックです。 Threは、Javaの静的コンストラクタのようなものではありません。 –

+1

@ JBNizet C#の人は静的なコンストラクタとしてそれを知っています。同じように動作します。私は既にリンクを追加しました。そして、質問者は "私はC#に精通しています"と言った。 –

+0

多分それはC#の言葉です。しかし、Javaではありません。用語は重要です。コンストラクタはインスタンスを構築します。 –

1

あなたはこのような配列を初期化することができます

public static int myArray[] = new int[10]; 
+0

その大丈夫です。ありがとうございました。質問の答えではありません。質問はこれです。なぜコンストラクタが起動時に実行されていないのですか?静的クラスがロードされない理由 –

+1

OK、JB Nizetは、彼のコメントで短い答えを出しました。オブジェクトが作成されない限り、コンストラクタは呼び出されません。 – JensS

関連する問題