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.
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)
请注意,这不是静态构造函数,而是静态初始化程序.什么都没有建成.
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |