这个问题取 self 的Java test
学习指南。有人能解释一下为什么会这样吗?
此代码打印出数字 5 而不是 12。您能解释一下原因吗?你能解释一下为什么如果第二个变量也是 final
会打印出 12,如果它们都不是 final
会打印出 0 吗?
public class Question26 {
public static void main(String[] args) {
System.out.println(Q26.q26.ans);
}
}
class Q26 {
public static Q26 q26 = new Q26();
public int ans;
private static final int var1 = 5;
private static int var2 = 7;
public Q26() {
ans = var1 + var2;
}
}
最佳答案
要知道在哪里声明 static
字段的地方是这些字段是按顺序初始化的;你不能写:
public class DoesNotCompile
{
private static final int foo = 1 + bar; // ERROR: bar is not defined
private static final int bar = 1;
然而,在你的情况下,情况有些不同:
class Q26 {
// Declared first, but NOT first to be initialized...
public static Q26 q26 = new Q26();
public int ans;
// The honor befalls to this one, since it is declared `final`
private static final int var1 = 5;
private static int var2 = 7; // zero until initialized
public Q26() {
ans = var1 + var2;
}
}
一个未初始化的int
的默认值为0;因为你的 Q26
实例是在 var1
和 var2
之前声明的,but 因为 var1
是首先初始化(因为它是final
),结果就是你看到的:ans
is 5.
与此代码等效的可能是:
class Q26 {
public static Q26 q26;
private static final int var1;
private static int var2;
static {
var1 = 5;
q26 = new Q26();
var2 = 7;
}
public int ans;
public Q26() {
ans = var1 + var2;
}
}
进一步说明:还有静态初始化 block ;并订购这些元素。你不能这样做:
public class DoesNotCompileEither
{
static {
foo = 3; // ERROR: what is foo?
}
private static final int foo;
如果你把静态初始化器放在 foo
的声明下面,那么这将编译:
public class ThisOneCompiles
{
private static final int foo; // declared
static {
foo = 3; // initialized
}
关于java - 静态最终 int v/s 静态 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433122/