簡體   English   中英

Java中的靜態初始化

[英]static initialization in java

我知道有很多與此問題類似的問題,但是我想對此問題進行一些詳細的解釋。

假設我有此代碼-

 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?

為什么是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

好的,因此,首先Java轉到類中最頂層的靜態聲明(將num2定義為int),然后將a定義為Finalexamples對象。 然后轉到您的靜態塊。 在靜態塊中,它看到a = new Finalexamples(); 因此,它將通過構造函數創建a (如果直到靜態初始化結束才執行此步驟,則a直到結束都將無法訪問,因為它沒有被構造,這是不好的!)因此,在變量a構造函數中,我們設置了Finalexamples.num2等於4。構造函數完成,Java返回執行靜態塊,並打印出Finalexamples.num2 ,現在為4。

首先了解此流程(僅適用於您的程序),

  1. 靜態變量的初始化。

     public static int num2; public static Finalexamples a; 

  2. 靜態塊的執行:

     static{ a = new Finalexamples(); System.out.println(num2); Finalexamples.num2 = 5; } 
  3. 在靜態塊中初始化Finalexamples的對象引用“ a”時,將調用Finalexamples類的構造函數。

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

  4. Finalexamples.main()方法。 哪個都沒有。

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

回答您的問題。

A.靜態變量在執行開始時僅初始化一次。這些變量將在任何實例變量初始化之前首先進行初始化。 它是屬於該類而不屬於object(instance)的變量。 該類的所有實例共享一個副本

B.不是'0'因為您正在使用Finalexamples的新對象在靜態塊中初始化對象引用。 這時將調用構造函數,並將num2的值設置為4

希望對您有所幫助!

您在Java中的最終輸出是5,您的兩個部分首先是類區域,其次是堆區域類區域塊包含三個塊方法區域,靜態區域,常量池。在類加載時運行static塊,因此您的靜態變量是在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...");
}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM