Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java main方法执行时不执行静态块_Java - Fatal编程技术网

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()将导致只创建一次
对象。这是因为默认构造函数为空,它不会调用其他对象的创建。
如果您的构造函数包含创建另一个对象的调用,它将递归地调用其他对象的创建

第一种情况:-

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我不是不同意你,我不需要你纠正我。答案已经确定。