天天看點

【面向對象設計基礎】存取方法+Private類成員和方法

本來不想寫這個的,太基礎了,不過為了整個學習筆記的完備性還是簡單寫幾筆給自己留着看。

1.存取方法也就是所謂的getter and setter,對于類中的private成員提供對外的接口,這樣的設計使得最後的在程式修改時隻需要修改這些setter and getter,而不必工程中修改所有與這個成員相關的東西,這些setter和getter不單單是為了給類外的對象使用的,内部使用時也盡可能使用,以提高程式的可修改性。而private類成員和方法是實作面向對象封裝特性的重要方法,相關的控制符權限級别在我前些時的一篇文字中()中有一個表和相關描述可供參考,封裝的好處在于:

2. 執行個體:一個比較有趣的例子是husband和wife的封裝例子,仔細看就會發現,Man類沒有提供getWife的方法,這是以為男人不想讓自己的妻子被外界通路。封裝可以吧一個對象的屬性私有,而提供一些可以被外界通路的屬性的方法,比如說,name屬性,Man和Woman類都有相應的get和 set方法,外界都可以通過這些方法通路和修改, 同時對一些改對象不想讓外界通路的屬性,就不提供其方法,比如說Man的wife屬性,就沒有get方法, 外界是不能帶到Man類的wife屬性的。

public class Man

{

//對屬性的封裝,一個人的姓名,年齡,妻子都是這個對象(人)的私有屬性

     private String name;

     private int age;

     private Woman wife;

//對改人對外界提供方法的封裝,可以設定妻子,姓名,年齡也可以獲得男人的姓名和年齡

    public void setWife(Woman wife)

   {

      this.wife = wife;

   }

   public String getName()

  {

     return name;

  }

   public void setName(String name)

       this.name = name;

   public int getAge()

      return age;

   public void setAge(int age)

      this.age = age;

}

public class Woman

    //屬性封裝

    private String name;

    private int age;

    private Man husband;

   //方法封裝

      this.name = name;

     return age;

     this.age = age;

   public Man getHusband()

       return husband;

   public void setHusband(Man husband)

        this.husband = husband;

3.優點:

1)可以改變内部實作,除了該類的方法之外,不會影響其他代碼。

例如,如果将對于名字的存取方法的而實作改為firstName + ' ' + lastName,對于這點改變,程式的其他部分完全不可見。

2)存取方法可以執行錯誤檢查,然而直接對域進行指派将不會進行這些處理。例如,setAge方法可以檢查年齡是否小于0。

4.注意:不要編寫傳回引用可變對象的 getter方法。由于傳回引用可變對象的方法會傳回一個對private成員的引用,對這個成員的修改可以繞過setter方法,這樣就會破壞封裝性,因為封裝性要求不能在别的類中修改本類的私有域,但是若傳回一個可變對象的引用,則别的類調用本類的getter就可以修改,這就破環了封裝。解決方法是,如果需要傳回一個可變對象的引用,應該首先對它進行克隆(clone)。

繼續閱讀