12)Java Constructor

Constructor
 
     構造器Constructor不能被繼承,所以不能重寫Overriding,但能夠被重載Overloading。
     構造器用來 確保每一個對象都會獲得初始化。當對象被建立時,若是該類具備構造器,java就會在用戶有能力操做對象以前自動調用相應的構造器,因此保證了初始化地進行。在java中建立和初始化被捆綁在了一塊兒,二者不能分離。 注意構造器沒有返回值.
     定義一個Java類時。 若是沒有顯式定義一個不帶參數的構造函數但定義了一個帶參數的構造函數,則不能再以不帶參數的構造函數建立一個該類的實例:[即若是已經定義了一個構造函數(不管有無參數),編譯器就不會幫你自動建立缺省構造函數].
這裏提到this關鍵字,它只能在方法內部使用,表示對「調用方法的那個對象」的引用。可使用this關鍵字在構造器中調用構造器。例:
 
Public class Flower{
      Static Test monitor=new Test();
      Int petalCount=0;
      String s=new String(「null」);
      Flower(int petals){petalCount=petals;}
      Flower(String ss){s=ss;}
      Flower(String s,int petals){
            This(petals);
            //This(s);  這裏是不容許的,由於儘管能夠用this調用一個構造器,可是不能調用2個
            This.s=s;
      }
}

     全部類都是繼承於Object的,在全部類實例化爲對象的時候,必然會先調用Object的默認構造函數。static方法就是沒有this的方法,static方法內部不能調用非靜態方法。若是一個類的構造函數是靜態的,那麼它將沒法調用Object的構造函數。所以構造函數不能聲明爲static類型。若是你想讓一個類的對象只有指定的靜態方法能夠返回,你能夠這樣。 
  class   Test { 
          private   Test(){ }//私有構造方法,這樣外部將沒法建立此類的對象。聯想單例模式   
          public static Test getInstance(){ 
                  return new Test();   //靜態公共方法,返回Test的對象。 
          }  }

(1)  類能夠沒有構造方法,但若是有多個構造方法,就應該要有默認的構造方法,不然在繼承此類時,須要在子類中顯式調用父類的某一個非默認的構造方法了。
(2)  在一個構造方法中,只能調用一次其餘的構造方法,而且調用構造方法的語句必須是第一條語句。
(3) 一個類繼承了另外一個類的內部類,由於超類是內部類,而內部類的構造方法不能自動被調用,這樣就須要在子類的構造方法中明確的調用超類的構造方法。

class C extends A.B {
      C() { 
            new A().super(); // 這一句就實現了對內部類構造方法的調用。
      }
}
構造方法也可這樣寫:
C(A a) {
     a.super();
} // 使用這個構造方法建立對象,要寫成C c = new C(a); a是A的對象。

-----------------------------------------------------------------易錯題:
class A {
      public int Avar;
      public A() {
            System.out.println("AAA");
            doSomething();
     }
      public void doSomething() {
            Avar = 1111;
            System.out.println("A.doSomething()");
     }
}

public class B extends A {
      public int Bvar = 2222;
      public B() {
            System.out.println("BBB");
            doSomething();
            System.out.println("Avar=" + Avar);
     }
      public void doSomething() {
            System.out.println("Bvar=" + Bvar);
     }
      public static void main(String[] args) {
            new B();
     } }      順序是這樣得,首先生成B就得先生成A,因此調用A的構造器,輸出AAA,而後調用方法dosomething,注意:A的該方法被B覆蓋,而你生成的是B的對象,因此它調用B的方法,因爲BVAR目前沒有給定值,因此自動初始化爲0;      而後生成B對象,先初始化變量BVAR,而後調用構造器輸出BBB,而後調用方法,這時BVAR已初始化,因此輸出BVAR=2222,而對象A中變量AVAR因爲沒有調用對象A的方法dosomething,因此其值爲0,則輸出0 所有輸出就以下:       AAA       Bvar=0       BBB       Bvar=2222       Avar=0      注意:初始化順序,當繼承時,先生成超類對象,生成對象時,先生成靜態變量,而後是通常變量,而後調用構造器!當全部超類對象生成後,生成本對象,順序同樣! 當方法被覆蓋時,調用目前對象的方法!
相關文章
相關標籤/搜索