我有一个这样的课 -
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));
}
}
如果我们在StackOverFlowException
方法中创建一个新对象,则代码会给main
,因为代码会陷入无限循环。对于静态块也应该如此。但鉴于代码编译并运行正常。任何人都可以解释这种行为吗?
答案 0 :(得分:0)
在静态块中移动A obj = new A();
将导致A
对象仅创建一次。这是因为您的默认构造函数为空,并且它不会调用其他对象的创建。
如果构造函数包含创建另一个Object的调用,它将递归调用创建更多对象
第一种情况: -
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`
答案 1 :(得分:0)
如果我不得不猜测,你已经用这种方式写了你的程序:
public A()
{
A obj = new A();
}
并且您没有正确地将代码复制到此问题中。
无论如何,上面的代码在构造函数中创建了一个新实例,它导致了一系列永不停止的调用,最终填满了可用的堆栈空间并导致堆栈溢出异常。这与静态块无关。