天天看點

“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

上一篇:保守VS開放?看清封裝對象屬性 | 帶你學《Java面向對象程式設計》之四

【本節目标】

通過閱讀本節,你将了解到為對象屬性指派的其他方法,學會通過對構造函數的多樣化運用實作對象的快速執行個體化,使代碼顯得更加簡潔、優雅。

5.1 構造方法

現在的程式在使用類的時候一般都按照如下的步驟進行:

(1)聲明并執行個體化對象,這時執行個體化對象中的屬性并沒有任何的資料存在,都是其對應資料類型的預設值。

(2)需要通過一系列的setter方法為類中的屬性設定内容。

也就是說現在要想真正獲得一個可以正常使用的執行個體化對象,必須經過兩個步驟才可以完成。

範例:傳統調用

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        age = a ;
    }
    public String getName(){
        return name ;
    } 
    public int getAge (){
        return age;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
        Person per = new Person() ;     //聲明并執行個體化對象
        per.setName = (“張三”) ;           //在類外部修改屬性
        per.setAge = (-18) ;                //在類外部修改屬性
  //2、對象的使用
        per.tell() ;            //進行方法的調用
    }
}           

但是如果按照這樣的方式來進行思考的話就會發現一個問題:假設類中的屬性有多個,這樣一來,按照之前的做法,此時需要調用多次的setter方法進行内容設定,這樣的調用比較麻煩,是以在Java中為了考慮對象初始化的問題,專門提供有構造方法,即:可以通過構造方法實作執行個體化對象中的屬性初始化處理。隻有在關鍵字new的時候使用構造方法,在Java程式中構造定義要求如下:

  • 構造方法名稱必須與類名稱保持一緻
  • 構造方法不允許設定任何的傳回值類型,即:沒有傳回值定義
  • 構造方法是在使用關鍵字new執行個體化對象的時候自動調用的

範例:構造定義方法

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
//方法名稱與類名稱相同,并且無傳回值定義
    public Person (String n, int a) {   //定義有參構造
        name = n ;           //為類中的屬性指派(初始化)
        age = a ;            //為類中的屬性指派(初始化)
    }
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
        Person per = new Person(“張三”, 18) ;     //聲明并執行個體化對象
  //2、對象的使用
        per.tell() ;            //進行方法的調用
    }
}           
“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

圖一 執行結果一

下面針對于目前的對象執行個體化格式與之前的對象執行個體化格式做一個比較:

之前的對象執行個體化格式:①Person ②per = ③new ④Person() ;

目前的對象執行個體化格式:①Person ②per = ③new ④Person(“張三”, 18) ;

  • “①Person”:主要是定義對象的所屬類型,類型決定了你可以調用的方法;
  • “②per”:執行個體化對象的名稱,所有的操作通過對象來進行通路;
  • “③new”:開辟一塊新的堆記憶體空間;
  • “④Person(“張三”, 18)”:調用有參構造、“④Person()”:調用無參構造

在Java的程式中考慮到程式結構的完整性,是以所有的類都會提供有構造方法,也就是說如果現在類中沒有定義任何構造方法,那麼一定會預設提供一個無參的,什麼都不做的構造方法,這個構造方法是在程式編譯的時候自動建立的。如果現在已經在類中明确定義有一個構造方法的時候,那麼這個預設的構造方法将不會被自動建立。

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
//方法名稱與類名稱相同,并且無傳回值定義
    public Person (String n, int a) {   //定義有參構造
        name = n ;           //為類中的屬性指派(初始化)
        age = a ;            //為類中的屬性指派(初始化)
    }
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        age = a ;
    }
    public String getName(){
        return name ;
    } 
    public int getAge (){
        return age;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
        Person per = new Person() ;     //聲明并執行個體化對象
  //2、對象的使用
        per.tell() ;            //進行方法的調用
    }
}           
“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

圖二 執行結果二

結論:一個類至少存在有一個構造方法,永恒存在。

疑問:為什麼構造方法上不允許設定傳回值類型?

既然構造方法是一個方法,那麼為什麼不讓它定義傳回值類型呢?

既然構造方法不會傳回資料,那麼為什麼不使用viod定義呢?

public Person (String n, int a) ;

public void Person (String n, int a) ;

分析:程式編譯器是根據代碼結構來進行編譯處理的,執行的時候也是根據代碼結構來處理的。

如果在構造方法上使用了void,那麼此結構就與普通方法的結構完全相同,這樣我們編譯器會認為此方法是普通方法。而普通方法與構造方法最大的差別:構造方法是在類對象執行個體化的時候調用的,而普通方法是在類對象執行個體化産生後調用的。

既然構造方法本身是一個方法,那麼方法就具有重載的特點,而構造方法重載的時候隻需要考慮參數的類型及個數即可。

範例:構造方法重載

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
    public Person() {}
    public Person(String n) {
        name = n ;
    }
//方法名稱與類名稱相同,并且無傳回值定義
    public Person (String n, int a) {   //定義有參構造
        name = n ;           //為類中的屬性指派(初始化)
        age = a ;            //為類中的屬性指派(初始化)
    }
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
        Person per = new Person(“張三”, 18) ;     //聲明并執行個體化對象
  //2、對象的使用
        per.tell() ;            //進行方法的調用
    }
}           
“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

圖三 執行結果三

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
    public Person() {
        name = “無名氏” ;
        age = -1 ;
    }
    public Person(String n) {
        name = n ;
    }
//方法名稱與類名稱相同,并且無傳回值定義
    public Person (String n, int a) {   //定義有參構造
        name = n ;           //為類中的屬性指派(初始化)
        age = a ;            //為類中的屬性指派(初始化)
    }
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
       Person per = new Person() ;     //聲明并執行個體化對象
  //2、對象的使用
       per.tell() ;            //進行方法的調用
    }
}           
“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

圖四 執行結果四

在進行多個構造方法定義的時候強烈建議大家有一些定義的順序,例如:可以按照參數的個數降序或升序排序。

經過分析可以發現,構造方法的确是可以進行資料的設定,而對于setter也可以進行資料的設定。構造方法是在對象執行個體化的時候為屬性設定初始化内容,而setter除了擁有設定資料的功能之外,還具有修改資料的功能。

範例:使用setter修改資料

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
//方法名稱與類名稱相同,并且無傳回值定義
    public Person (String n, int a) {   //定義有參構造
         name = n ;           //為類中的屬性指派(初始化)
         age = a ;            //為類中的屬性指派(初始化)
    }
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
    public void setName(String n){
        name = n ;
    }
    public void setAge(int a){
        age = a ;
    }
    public String getName(){
        return name ;
    } 
    public int getAge (){
        return age;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
   //1、對象的初始化準備
        Person per = new Person(“張三”, 10) ;     //聲明并執行個體化對象
  //2、對象的使用
        per.setAge(18);        //修改屬性内容
        per.tell() ;            //進行方法的調用
    }
}           
“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五

圖五 運作結果五

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:3分鐘速懂匿名對象 | 帶你學《Java面向對象程式設計》之六 更多Java面向對象程式設計文章檢視此處