1. 程式人生 > >06.構造方法與匿名物件

06.構造方法與匿名物件

               如果要例項化新的物件, 需要使用關鍵字new來完成, 但是除了new這個關鍵字之外, 還有可能在物件例項化時為其進行一些初始化的準備操作, 這個時候就需要構造方法的支援。

構造方法本身是一種特殊的方法, 它只在新物件例項化的時候呼叫, 其定義原則是:方法名稱與類名稱相同, 沒有返回值型別宣告, 同時構造方法也可以進行過載。

             實際上在物件例項化的格式中就存在構造方法的使用, 下面通過物件的例項化格式來分析。

             構造方法是在例項化新物件(new)的時候只調用一次;

             普通方法是在例項化物件產生之後, 通過“物件方法” 呼叫多次。

             如果在構造方法上使用了void, 其定義的結構與普通方法就完全一樣, 而程式的編譯是依靠定義結構來解析的, 所以不能有返回值宣告。

             構造方法的主要功能是進行物件初始化操作, 所以要是希望在物件例項化時進行屬性的賦值操作,則可以使用構造方法完成。

範例:利用構造方法為屬性賦值。

class Book  { //定義一個新的類
    private String title;
    private double price;
    public void setTitle(String t){
        title=t;

    }
    public void setPrice(double p){
        if (p>0.0){
            price=p;
        }
    }
    public String getTitle(){
        return title;
    }
    public double getPrice(){
       return price;
    }
    public void getInfo(){
          System.out.println("圖書名稱:"+title+price);
    }
public class TestOo4{
    public static void main(String args[]){
        Book ba=new Book("Java開發",8.8);
    }
}

                在實際的工作中, 構造方法的核心作用是, 在類物件例項化時設定屬性的初始化內
容。
構造方法是為屬性初始化準備的。在本程式中由於已經明確地定義了一個有參構造方
法, 就不會再向動生成預設的構造方法, 即一個類中至少保留有一個構造方法。
另外還需要提醒的是, 此時類中的結構包含屬性、構造方法、普通方法, 而編寫
的時候一定要注意順序:首先編寫屬性(必須封裝, 同時提供setter、getter的普通方
法), 然後編寫構造方法, 最後編寫普通方法。
雖然這些與語法無關, 但是每一個程式設計師
都需要養成良好的編碼習慣。

                 構造方法本身也屬於方法, 所以可以針對構造方法進行過載。由於構造方法定義的特殊性, 所以在
構造方法過載時, 要求只注意引數的型別及個數即可。

範例:構造方法過載。

class Book{
    private String title;
    private double price;
        public Book(){
               System.out.println("無參構造");   
      }
       public Book(String t){
             title=t;
            System.out.println("有一個引數的構造");

    }
       public Book(String t,double p) { //有兩個引數的構造
             title =t; //直接為屬性賦值
             price = p ; //直接為屬性賦值
             System.out.println(”有兩個引數的構造”);
    }
      public void getlnfo() {
         System.out.println(”圖書名稱·“+ title+ ”,價格·”+ price);
   }
     public class TestDemo {
            public static void main(Slring args[]) {
              Book book = new Book("Java開發”);//宣告並例項化物件
                  book.getlnfo();//呼叫方法


}

注意:注意編寫l順序。
              在一個類中對構造方法過載時, 所有的過載的方法按照引數的個數由多到少, 或
者是由少到多排列。以下兩種排列方式都是規範的。
 

               在定義一個類時, 可以為屬性直接設定預設值, 但是這個預設值只有在構造執行
完才會設定, 否則不會設定。而構造方法屬於整個物件構造過程的最後一步, 即是留
給使用者處理的步驟。
              在物件例項化的過程中, 一定會經歷類的載入、記憶體的分配、預設值的設定、構
造方法。

class Book {
private String title = ”Java開發” ;
public Book() {} // title現在的預設值跟此構造方法沒關係
}

匿名物件

                  按照之前的記憶體關係來講, 物件的名字可以解釋為在堆記憶體中儲存, 而物件的具體內容(屬性)在
堆記憶體中儲存, 這樣一來, 沒有棧記憶體指向堆記憶體空間, 就是一個匿名物件;

範例:定義匿名物件;

class Book{
    private String title;
    private double price;
    public Book(String t,double p){
         title=t;
         price=p;
  }
 //setter,getter略
   public void getInfo(){
        System.out.println("圖書名稱:"+title+",價格:"+price);
   }
public class TestDemo{
      public static void main(String args[]){
        new Book("java",10).getInfo();//匿名物件 
      
   }
}

        本程式通過匿名物件呼叫了類中的方法, 但由於匿名物件沒有對應的戰記憶體指向, 所以只能使用一
次, 一次之後就將成為垃圾, 並且等待被GC回收釋放。