Java 未加载静态类
我熟悉C#,现在在Java中学习静态类。 在下面的代码中,我假设staticClass构造函数在启动时已经初始化。但事实并非如此。当调试游标到达main方法中第一个for循环的断点时。我得到一个错误“staticClass未加载” 问:在执行主方法之前,有没有一种方法可以执行静态类构造函数?或者为什么它没有加载?类似的静态类在启动时加载到C#中。但是在爪哇?请考虑这是一个不工作的代码。作为java专家,您如何重写此代码?应该纠正的Java 未加载静态类,java,class,constructor,static,static-constructor,Java,Class,Constructor,Static,Static Constructor,我熟悉C#,现在在Java中学习静态类。 在下面的代码中,我假设staticClass构造函数在启动时已经初始化。但事实并非如此。当调试游标到达main方法中第一个for循环的断点时。我得到一个错误“staticClass未加载” 问:在执行主方法之前,有没有一种方法可以执行静态类构造函数?或者为什么它没有加载?类似的静态类在启动时加载到C#中。但是在爪哇?请考虑这是一个不工作的代码。作为java专家,您如何重写此代码?应该纠正的 public class Main { public
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);
}
}
}
公共类主{
公共静态类staticClass
{
公共静态int-myArray[];
公共类()
{
myArray=新整数[10];
}
公共静态int NextUnique()
{
int r=(int)(Math.random()*10);
返回r;
}
}
//=新整数[10];
公共静态void main(字符串[]args)引发ClassNotFoundException{
对于(int i=0;i,您可以像这样初始化数组:
public static int myArray[] = new int[10];
为此,您需要使用静态初始化块(构造函数)
public staticClass()
{
myArray=new int[10];
}
使用
您的构造函数现在是实例构造函数。每当您使用新运算符时,它都会工作。请参见和嵌套类与tp级别的类类似,只是它嵌套在另一个类中,并且可以访问其封闭类的私有成员。它的行为与任何其他类一样。因此,如果您从不调用它,它的构造函数将不会被神奇地调用它无处不在。我不喜欢将一个类嵌入另一个类中,但我认为这是java中唯一的方法。静态类可以单独/不需要吗?当然,除非在这种情况下,你不需要static关键字。它只是成为一个顶级类,就像你的主类一样。我不确定你说的“这是唯一的方法”是什么意思。唯一的方法是什么?声明一个静态类。一个静态类必须嵌套在另一个类中。正如我阅读的文档。这是唯一的方法。是的:public class程序{public static void main(String[]args){System.out.println(Other.var1);}}class其他{public static int var1=15;}
。但Other只是一个类。与任何其他类一样,它不是单例。Java中没有这类东西(除了使用单例模式)。将其设为嵌套类不会改变这一点。在Java中,静态不会将类转换为单例(正如您在C中所暗示的那样)没关系。谢谢。但这不是问题的答案。问题是。为什么构造函数在启动时不执行?为什么静态类没有加载。好的,JB Nizet在他的评论中给出了简短的答案:除非创建对象,否则不会调用构造函数。这不是静态构造函数。这是静态初始化块。这不是这样的事情作为Java中的静态构造函数。@JBNizet C#初学者都知道它是静态构造函数。它的工作方式相同。我已经添加了链接。提问者说“我熟悉C#”。也许这是C#中的术语。但在Java中不是。术语很重要。构造函数构造实例。这是duck test。“如果它看起来像鸭子,游泳像鸭子,嘎嘎叫像鸭子,那么它可能就是鸭子”静态初始化块和静态构造函数的工作方式相同。它们是相同的东西,但名称不同。
static
{
myArray=new int[10];
}