天天看點

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

上一篇:對象“變形記”——初識引用與GC | 帶你學《Java面向對象程式設計》之三

【本節目标】

通過閱讀本節内容,你将深刻了解封裝對象屬性的重要性,并學會如何按照Java開發标準正确地實作屬性封裝與通過封裝的方法在類外調用其屬性。

4.1 成員屬性封裝

在類之中的組成就是屬性與方法,一般而言方法都是對外提供服務的,是以是不會提供封裝處理的,而對于屬性,由于其需要較高的安全性,是以往往需要對其進行保護,這種情況下,就需要采用封裝性對屬性進行保護。

在預設情況下,對于類中的屬性是可以通過其他類利用對象重複調用的。

範例:屬性不封裝情況下的問題

class Person{    //定義一個類
    String name ;  //人員的姓名
    int age ;       //人員的年齡
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
      Person per = new Person() ;     //聲明并執行個體化對象
      per.name = “張三” ;           //在類外部修改屬性
      per.age = -18 ;                //在類外部修改屬性
      per.tell() ;            //進行方法的調用
  }
}           
保守VS開放?看清封裝對象屬性 | 帶你學《Java面向對象程式設計》之四

圖一 執行結果一

此時在person類中提供的name與age兩個屬性并沒有進行封裝處理,這樣外部就可以直接進行調用,但是有可能設定的資料是錯誤的資料(per.age = -18 ;)。如果要想解決這樣的問題就可以利用private關鍵字對屬性進行封裝處理。

範例:對屬性進行封裝

class Person{    //定義一個類
    private String name ;  //人員的姓名
    private int age ;       //人員的年齡
    public void tell() {
        System.out.println(“姓名:”+ name +”、年齡:”+age) ;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
        Person per = new Person() ;     //聲明并執行個體化對象
        per.name = “張三” ;           //在類外部修改屬性
        per.age = -18 ;                //在類外部修改屬性
        per.tell() ;            //進行方法的調用
  }
}           
保守VS開放?看清封裝對象屬性 | 帶你學《Java面向對象程式設計》之四

圖二 執行結果二

而屬性一旦封裝之後外部将不能夠直接通路,即:對外部不可見,但是對類的内部是可見的,如果想讓外部的程式可以通路封裝的屬性,則在Java開發标準中提供有如下要求:

【setter、getter】設定或取得屬性可以使用setXxx()、getXxx()方法,以:private String name 為例;

  • 設定屬性方法:public void setName(String n);
  • 擷取屬性方法:public String getName()。

範例:實作封裝

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[]) {
        Person per = new Person() ;     //聲明并執行個體化對象
        per.setName = (“張三”) ;           //在類外部修改屬性
        per.setAge = (-18) ;                //在類外部修改屬性
        per.tell() ;            //進行方法的調用
    }
}           
保守VS開放?看清封裝對象屬性 | 帶你學《Java面向對象程式設計》之四

圖三 執行結果三

年齡是負數,不符合正常。

修改:

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){
        if(a >= 0){
            age = a ;
        }
    }
    public String getName(){
        return name ;
    } 
    public int getAge (){
        return age;
    } 
}
public class JavaDemo {      //主類
    public static void main(String args[]) {
        Person per = new Person() ;     //聲明并執行個體化對象
        per.setName = (“張三”) ;           //在類外部修改屬性
        per.setAge = (-18) ;                //在類外部修改屬性
        per.tell() ;            //進行方法的調用
    }
}           
保守VS開放?看清封裝對象屬性 | 帶你學《Java面向對象程式設計》之四

圖四 執行結果四

在以後進行任何類定義的時候一定要記住,類中所有屬性都必須使用private封裝,并且屬性如果要進行通路,必須要提供有setter、getter方法。

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

本内容視訊來源于

阿裡雲大學 下一篇:“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五 更多Java面向對象程式設計文章檢視此處