我的一个朋友问我哪个将加载第一个静态变量或静态块。
我的答案指向静态变量。
所以他给了我两个方程并说要区分它们
第一个方程
public class Some {
public static void main(String args[])
{
System.out.println(Some.x);
}
static {
System.out.println(Some.x);
}
static int x=90;
}
输出/输出: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);
}
}
输出/输出:90 90
我尝试反编译字节码,发现上面的方程是相同的。 请帮我区分它们。 当静态变量初始化时我很困惑。
静态块按照它们在源文件中出现的顺序进行初始化。 堆栈溢出上已经有几个与此相关的问题...... 这个为您提供了一个很好的答案:Java:静态最终字段以什么顺序初始化?
静态变量和静态块按照它们出现的顺序执行。
这里第一个 O/P: 0 90 如在静态变量初始化语句之后执行的静态块的
System.out.println(Some.x);
语句中那样 static int x=90;
静态变量在 JVM 加载类时执行,并且类在实例化或调用其静态方法时加载。
静态初始化块在类实例化之前或调用其静态方法之前,甚至在使用其静态变量之前进行初始化。
我给出了一个静态和实例内容控制流的简单示例:
假设您有 2 个类别 A 和 B。 类 A 扩展至类 B。并且类 B 有一个 main 方法。成功编译后,您在 cmd 上的命令如下:
java B
现在会发生什么,一步步看:
类 A 的构造函数(默认构造函数或任何其他构造函数,如果您从 B 的构造函数调用它)将 被处决
然后所有实例 成员初始化和实例块执行将在 B级
注意:静态成员和块在第一次加载类时只执行一次,而实例成员和实例块在每次创建类的对象时都会执行一次。 如果我不正确,请告诉我。