我的一位朋友问我哪个会加载第一个静态变量或静态块。
我的回答指向静态变量。
所以他给了我两个方程式并说要区分它们
第一个等式
public class Some {
public static void main(String args[])
{
System.out.println(Some.x);
}
static {
System.out.println(Some.x);
}
static int x=90;
}
O / P:0 90
第二个等式
public class Some {
public static void main(String args[])
{
System.out.println(Some.x);
}
static int x=90;
static {
System.out.println(Some.x);
}
}
O / P:90 90
我试图对字节代码进行反编译,发现它对于上述两个方程都是相同的。 请帮我区分它们。 当静态变量初始化时我很困惑。
答案 0 :(得分:6)
静态块按照它们在源文件中出现的顺序进行初始化。 关于堆栈溢出有几个问题已经存在...... 这个有一个很好的答案:Java : in what order are static final fields initialized?
答案 1 :(得分:2)
静态变量和静态块按它们出现的顺序执行。
这里首先是O / P:0 90,就像在静态变量初始化语句System.out.println(Some.x);
static int x=90;
语句一样
答案 2 :(得分:-1)
静态变量在JVM加载Class时执行,而Class在实例化或调用静态方法时会被加载。
static Initializer Block在Class被实例化之前或者在调用静态方法之前获得Initialized,甚至在使用静态变量之前就已经初始化了。
答案 3 :(得分:-1)
我给出了一个简单的例子来说明静态和实例的控制流程:
假设您有2个A和B分支。 A类扩展到B类,B类有主方法。成功编译cmd上的命令后,就像:
java B
现在将会发生一步一步的事情:
类A的构造函数(如果从B的构造函数中调用它,则为默认构造函数或任何其他构造函数) 执行
然后是所有实例 成员初始化和实例块执行将在 B级
注意:第一次加载类时,静态成员和块执行只执行一次,而每次创建类的对象时,实例成员和实例块都会执行。 如果我不对,请告诉我。