返回静态初始化程序

Mar*_*aux 11 java return static-constructor class-constructors

这不是有效的代码:

public class MyClass
{
    private static boolean yesNo = false;

    static
    {
        if (yesNo)
        {
            System.out.println("Yes");
            return; // The return statement is the problem
        }
        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个愚蠢的例子,但在静态类构造函数中我们不能return;.为什么?这有充分的理由吗?有人知道更多关于此的事情吗?

所以我应该做的return就是结束那里的建设.

谢谢

Oak*_*Oak 15

我认为原因是初始化器与字段初始化一起进行(对于构造函数,在实例初始化器的情况下).换句话说,JVM只识别一个地方来初始化静态字段,因此所有初始化 - 无论是否在块中 - 必须在那里完成.

所以,例如,当你写一个类时:

class A {
    static int x = 3;
    static {
        y = x * x;
    }
    static int z = x * x;
}
Run Code Online (Sandbox Code Playgroud)

然后它就像你写的那样:

class A {
    static int x, y, z;
    static {
        x = 3;
        y = x * x;
        z = x * x;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您查看反汇编,则会确认:

static {};
  Code:
   0:   iconst_3
   1:   putstatic       #5; //Field x:I
   4:   getstatic       #5; //Field x:I
   7:   getstatic       #5; //Field x:I
   10:  imul
   11:  putstatic       #3; //Field y:I
   14:  getstatic       #5; //Field x:I
   17:  getstatic       #5; //Field x:I
   20:  imul
   21:  putstatic       #6; //Field z:I
   24:  return
Run Code Online (Sandbox Code Playgroud)

因此,如果您在静态初始化程序的中间某处添加了"返回",那么它也会阻止计算z.

  • 刚想写的时候看到这个。另请注意,一个类中可以有多个静态初始化程序块。 (2认同)

Boz*_*zho 10

  • 程序流程总是可以构建成不需要的return.(在你的例子System.exit(0)中加入一个else子句可以达到预期的效果)

  • 你真的需要它,你可以用静态方法移动代码并从初始化程序中调用它:

.

static {
    staticInit();
}

private static void staticInit() {
    if (yesNo) {
        System.out.println("Yes");
        return;
    }
    System.exit(0);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不是静态构造函数,而是静态初始化程序.什么都没有建成.