2017-09-16 110 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