Java main方法执行时不执行静态块
我有一节这样的课-Java main方法执行时不执行静态块,java,Java,我有一节这样的课- class A { static { A obj = new A(); } int x = 0; public A() {} public static int square(int x) { return x * x; } public static void main(String[] args) { //A obj = new A(); Syste
class A {
static {
A obj = new A();
}
int x = 0;
public A() {}
public static int square(int x) {
return x * x;
}
public static void main(String[] args) {
//A obj = new A();
System.out.println("Hello World!" + square(4));
}
}
如果我们在
main
方法中创建一个新对象,则该代码将给出StackOverFlowException
,因为代码卡在无限循环中。静态块也应如此。但给定的代码编译并运行良好。有人能解释这种行为吗?移动A obj=new A()静态块内的code>将导致只创建一次对象。这是因为默认构造函数为空,它不会调用其他对象的创建。
如果您的构造函数包含创建另一个对象的调用,它将递归地调用其他对象的创建
第一种情况:-
static {
A obj = new A();
}
int x = 0;
public A() {} ///// gets executed due to static initalizer and stops there.
第二种情况:-
public A() {
A obj = new A();
} ///// recursively calls Objects resulting in `StackOverFlowException`
如果让我猜的话,您是这样编写程序的:
public A()
{
A obj = new A();
}
您没有正确地将代码复制到此问题
无论如何,上面的代码段在构造函数中创建了一个新实例,这将导致一系列永无止境的调用,最终填满可用的堆栈空间,并导致堆栈溢出异常。这与静态块无关。为什么即使创建新对象也会发生此问题?创建新对象不会导致此处出现StackOverFlowException
。这一定是由其他原因造成的。当类加载器加载该类时,静态块只执行一次。@jgitter,因为构造函数为空,不会进一步创建objects@KumarAbhinav我不是不同意你,我不需要你纠正我。答案已经确定。