哪个将首先加载静态变量或静态块? [重复]

问题描述 投票:0回答:4

我的一个朋友问我哪个将加载第一个静态变量或静态块。

我的答案指向静态变量。

所以他给了我两个方程并说要区分它们
第一个方程

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 static stack
4个回答
8
投票

静态块按照它们在源文件中出现的顺序进行初始化。 堆栈溢出上已经有几个与此相关的问题...... 这个为您提供了一个很好的答案:Java:静态最终字段以什么顺序初始化?


2
投票

静态变量和静态块按照它们出现的顺序执行。

这里第一个 O/P: 0 90 如在静态变量初始化语句之后执行的静态块的

System.out.println(Some.x);
语句中那样
static int x=90;


-1
投票

静态变量在 JVM 加载类时执行,并且类在实例化或调用其静态方法时加载。

静态初始化块在类实例化之前或调用其静态方法之前,甚至在使用其静态变量之前进行初始化。


-1
投票

我给出了一个静态和实例内容控制流的简单示例:

假设您有 2 个类别 A 和 B。 类 A 扩展至类 B。并且类 B 有一个 main 方法。成功编译后,您在 cmd 上的命令如下:

java B

现在会发生什么,一步步看:

  1. A 类和 B 类将被加载
  2. A 类的静态成员和块将被识别并被 顺序执行(一个接一个)(但仅在类加载时执行一次)
  3. B类的静态成员和块将被识别并执行(一个接一个)(但仅在类加载时执行一次)
  4. 将调用B类的main方法(如果B类没有main方法,则将调用A类的main方法)
  5. 一旦创建 A 类的对象:所有实例 成员初始化和实例块执行将在 A级
  6. A类的构造函数(用于创建对象)将 被处决
  7. 如果创建B类的对象:所有实例 成员初始化和实例块执行将在 A 级。
  8. 类 A 的构造函数(默认构造函数或任何其他构造函数,如果您从 B 的构造函数调用它)将 被处决

  9. 然后所有实例 成员初始化和实例块执行将在 B级

  10. 然后是类 B 的构造函数(您用于 创建对象)将被执行

注意:静态成员和块在第一次加载类时只执行一次,而实例成员和实例块在每次创建类的对象时都会执行一次。 如果我不正确,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.