程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> JAVA技術專題綜述之構造方法篇

JAVA技術專題綜述之構造方法篇

編輯:JAVA編程入門知識
  類的繼續機制使得子類可以使用父類的功能(即代碼),並且子類也具有父類的類型。下面介紹類在繼續關系上的初始化的順序問題。
  
  示例1:
  

   

   

   

   

class SuperClass
  {
  SuperClass()
  {
  System.out.println("SuperClass constrUCtor");
  }
  }
  public class SubClass extends SuperClass
  {
  SubClass()
  {
  System.out.println("SubClass constructor");
  }
  public static void main(String[] args)
  {
  SubClass sub = new SubClass();
  }
  }
  輸出結果: SuperClass
  constructor
  SubClass constructor
  在子類中只實例化了一個子類對象。從輸出結果上看,程序並不是一開始就運行自己的構造方法,而是先運行其父類的默認構造方法。注重:程序自動調用其父類的默認構造方法。
  
  示例2:
  
   class SuperClass
  {
  SuperClass(String str)
  {
  System.out.println("Super with a string.");
  }
  }
  public class SubClass extends SuperClass
  {
  SubClass(String str)
  {
  System.out.println("Sub with a string.");
  }
  public static void main(String[] args)
  {
  SubClass sub = new SubClass("sub");
  }
  }
  在JDK下編譯此程序不能成功。正如上例中說的:程序在初始化子類時先要尋找其父類的默認構造方法,結果沒找到,那麼編譯自然不能通過。
  
  解決這個問題有兩個辦法:
  
  1.在父類中增加一個默認構造方法。
  2.在子類的構造方法中增加一條語句:super(str); 且必須在第一句。
  
  這兩種方法都能使此程序通過編譯,但就本程序來說運行結果卻不相同。
  
  第1種方法的運行結果是:
  
  Sub with a string.
  
  第2種方法的運行結果是:
  
   Super with a string.
  Sub with a string.
  第2種解決方法實際上是指定編譯器不要尋找父類的默認構造方法,而是去尋找帶一個字符串為參數的構造方法。
  
     下面介紹對象的初始化順序問題。
  
  示例3:
  
   class One
  {
  One(String str)
  {
  System.out.println(str);
  }
  }
  class Two
  {
  One one_1 = new One("one-1");
  One one_2 = new One("one-2");
  One one_3 = new One("one-3");
  Two(String str)
  {
  System.out.println(str);
  }
  }
  public class Test
  {
  public static void main(String[] args)
  {
  System.out.println("Test main() start...");
  Two two = new Two("two");
  }
  }
  輸出結果:
  Test main() start...
  one-1
  one-2
  one-3
  two
  在main()方法中實例化了一個Two類的對象。但程序在初始化Two類的對象時,並非先調用Two類的構造方法,而是先初始化Two類的成員變量。這裡Two類有3個成員變量,它們都是One類的對象,所以要先調用3次One類的相應的構造方法。最後在初始化Two類的對象。
  
  示例4:
  
   class One
  
  {
  One(String str)
  {
  System.out.println(str);
  }
  }
  class Two
  {
  One one_1 = new One("one-1");
  One one_2 = new One("one-2");
  static One one_3 = new One("one-3");
  Two(String str)
  {
  System.out.println(str);
  }
  }
  public class Test
  {
  public static void main(String[] args)
  {
  System.out.println("Test main() start...");
  Two two_1 = new Two("two-1");
  System.out.println("------------");
  Two two_2 = new Two("two-2");
  }
  }
  輸出結果:
  Test main() start...
  one-3
  one-1
  one-2
  two-1
  ------------
  one-1
  one-2
  two-2
  假如一個類中有靜態對象,那麼它會在非靜態對象前初始化,但只初始化一次。非靜態對象每次調用時都要初始化。
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved