2017-09-16 142 views
1

我熟悉C#,現在學習Java中的靜態類。 在下面的代碼中,我假設如果staticClass構造函數已在啓動時初始化。但事實並非如此。在主要方法中調試光標到第一個循環的斷點時。我收到一個錯誤「staticClass not loaded」。靜態類未加載

問題:有沒有一種方法可以在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

當然,除了那種情況,你不需要static關鍵字。它只是成爲一個頂級課程,就像你的主課程一樣。我不確定你的意思是「這是唯一的方式」。唯一的辦法是做什麼? –

回答

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

好的,JB Nizet在他的評論中給出了簡短的回答:構造函數不會被調用,除非該對象被創建。 – JensS