Java 學習之的對象初始化的講究

java在初始化的時候也有很多講究,因爲java中出現了類,所以在初始化的時候就有可能使用到創建新對象,所以,對於初始化的順序要求的比較嚴格,請看下面一個程序,是thinking in java中的一個程序,被我稍加改編,這樣可以更好的說明幾個初始化的要點:
  
  class Cup
  
  {
  
      Cup(int marker)
  
      {
  
         System.out.println("Cup(" + marker + ")");
  
      }
  
      void f(int marker)
  
      {
  
         System.out.println("f(" + marker + ")");
  
      }
  
  }
  
  class Cups
  
  {
  
      static Cup c1=new Cup(1);
  
      Cup c3=new Cup(3);
  
      static Cup c2= new Cup(2);
  
      Cups()
  
      {
  
         System.out.println("Cups()");
  
      }
  
      Cup c4=new Cup(4);
  
  }
  
  public class ExplicitStatic
  
  {
  
      Cups c=new Cups();
  
      {
  
         System.out.println("Hello");
  
      }
  
      public static void main(String[] args)
  
      {
  
         System.out.println("Inside main()");
  
         Cups.c1.f(99);
  
         ExplicitStatic x=new ExplicitStatic();
  
      }
  
      static Cups x = new Cups();
  
  }
  
  大家可以手動執行一下這個程序,考慮一下結果是什麼,然後參照下面的答案對照一下,看看是否正確:
  
  Cup(1)
  
  Cup(2)
  
  Cup(3)
  
  Cup(4)
  
  Cups()
  
  Inside main()
  
  f(99)
  
  Cup(3)
  
  Cup(4)
  
  Cups()
  
  Hello
  
  我總結了四個初始化的要點,如下:
  
  1、如果有static,即靜態成員定義,首先初始化static的變量,如,在類Cups中c3在c2前面,可是在輸出的結果中,你可以發現,c2是在c3前執行的,這就是因爲,所有的static都在第一時間被初始化。
  
  2、Static只初始化一次,在第二次創建類的對象的時候,就不會去執行static的語句,如,在第二次執行new Cups()的時候,就只輸出了Cup(3)和Cup(4),顯然,static的兩個創建對象的語句沒有做。
  
  3、變量的初始化在方法前。如,在Cups類中,方法Cups()在語句Cup c4=new Cup(4)之前,可是輸出結果的時候,打印的Cups()卻在Cup(4)之後。
  
  4、在含有main的類中執行順序是先做static,然後就是main,而不是像其它類一樣,除了static就按順序做下來。如,在main函數中,如果去掉語句ExplicitStatic x=new ExplicitStatic(),則Cups c=new Cups()和System.out.println("hello")都不會執行。另外,留個小問題,如果去掉了System.out.println("hello")外的括號會怎麼樣呢?  
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章