java中的静态初始化

时间:2017-04-17 13:01:33

标签: java jvm

我知道有很多类似的问题,但我希望得到一些关于这个问题的详细解释。

假设我有这段代码 -

 public class Finalexamples {

        public int num = 3;
        public static int num2;
        public static Finalexamples a;

        public Finalexamples(){
            Finalexamples.num2 = 4;
        }

        static{
            a = new Finalexamples();
             System.out.println(num2);
             Finalexamples.num2 = 5;
            }

    public static void main(String[] args) {
        System.out.println("Starting...");
    }

}
  1. 当JVM加载.class文件时,是否首先使用默认值初始化静态变量,然后当程序以字面值运行时?
  2. 在我的例子中,静态块输出" 4" (固定),如果可以解释为什么它不是0?

4 个答案:

答案 0 :(得分:3)

为什么0?它应该输出4而不是。

加载类时,将按照幻影的顺序读取和执行静态字段和语句。

首先执行这些:

public static int num2;
public static Finalexamples a;

然后调用它:

 static{
          a = new Finalexamples();
          System.out.println(num2);
          Finalexamples.num2 = 5;
      }

这:a = new Finalexamples();执行:Finalexamples.num2 = 4;

因此System.out.println(num2);会显示4

答案 1 :(得分:0)

好的,首先Java转到类中最顶层的静态声明(定义{{​​1}}作为int),然后将num2定义为a对象。然后它转到你的静态块。在静态块中,它会看到Finalexamples,然后通过构造函数创建a = new Finalexamples();。 (如果在静态初始化结束之前没有执行此步骤,a将无法访问,直到结束,因为它没有构造,这不好!)所以在我们的构造函数中变量a我们设置a等于4.构造函数完成后,Java返回执行静态块,并打印出Finalexamples.num2,现在为4。

答案 2 :(得分:0)

首先了解此流程(仅适用于您的程序),

  1. 静态变量的初始化。

    public static int num2;
    public static Finalexamples a;

  2. 执行静态块:

    static{
        a = new Finalexamples();
         System.out.println(num2);
         Finalexamples.num2 = 5;
        }
  3. 在初始化对象引用时,' a'在静态块中Finalexamples,将调用Finalexamples类的构造函数。

    public Finalexamples(){
                Finalexamples.num2 = 4;
      }

  4. Finalexamples.main()方法。什么都没有。

    public static void main(String[] args) {
            System.out.println("Starting...");
        }

  5. 回答你的问题。

    一个。静态变量在执行开始时仅初始化一次。这些变量将在任何实例变量初始化之前首先初始化。它是属于类的变量而不是对象(实例)。要由类

    的所有实例共享的单个副本

    B中。它不是'0'因为您正在使用Finalexamples的新对象初始化静态块中的对象引用。此时将调用构造函数,并将num2的vaule设置为4

    我希望这有帮助!

答案 3 :(得分:0)

你最后的输出是5 在java中,你的两个部分首先是Class Area,第二部分是Heap区域 类区块包含三个块 方法区域,静态区域,常量pool.static块在类加载时运行所以你的静态变量是在静态块中创建的,它是在静态块的运行时初始化的,而静态变量不会在java中创建多个副本,所以你可以测试像这样的代码

public class HelloWorld{

    public int num = 3;
    public static int num2;
    public static HelloWorld a;

    public HelloWorld(){
         System.out.println("Constructor Creation value of num2 "+num2);
         HelloWorld.num2 = 4;
         System.out.println("Variable Initialization in Constructor value of num2 "+num2);
    }

    static{

         System.out.println("Static bloack execution  value of num2 "+num2);
          a = new HelloWorld();
         HelloWorld.num2 = 5;
         System.out.println("Variable Initialization in Static bloack value of num2 "+num2);
        }

public static void main(String[] args) {
    System.out.println("Starting...");
}}