1. 程式人生 > >談面向對象的三大特征

談面向對象的三大特征

不同 列表 getname 拒絕 round 控制語句 -s lan print

 引:什麽是面向對象?

 面向對象,專註於由誰(哪個對象)來解決這個問題,而調用者無需關註對象實現的細節。

 編程特點:出現了一個個的類,從類中拿到對象,通過對象直接解決問題。

 應用:Java PHP c++ c# Python

 面向對象的三大特征:繼承 封裝 多態

 分別了解繼承、封裝、多態 ↓↓↓

一、繼承

 1、子類繼承父類,使用extends關鍵字。

  代碼示例:

    public class Person {

      String name;

      String sex;

      int age;

    }

    public class Chinese extends Person {

      String language;

    }

    Chinese子類繼承Person父類

 2、子類中,需要訪問父類成員,使用super關鍵字。

    super.屬性 訪問父類屬性

    super.方法 訪問父類方法

  → 如果,子類中沒有同名的屬性和方法覆蓋父類,則依然可以直接使用 this.屬性 調用從父類中繼承的非私有屬性。

    但是,如果子類中重寫了與父類同名的屬性:this.屬性 訪問的是本類super.屬性 訪問的是父類屬性

    例:     

     public class Chinese extends Person {

       String name = "aa";

       String language = "Chinese";

     }

     System.out.println(super.name);

     System.out.println(this.language);

  → 在子類構造函數中,直接使用super(); 表示調用父類構造。而且,super()函數必須在子類構造的第一行。

    代碼示例:

     public Chinese (String name,String sex,int age,String language){

        super(name,sex,age);

        this.language = language;

     }

  註意:即使使用super關鍵字,也不能繼承父類的私有屬性和私有方法。

 3、子類可以訪問父類哪些屬性和方法?

  private           本類

  默認省略(friendly)      本類    同包

  protected    本類   同包   非同包子類

  public        本類 同包 非同包子類 其他任何包都可用

  → 子類與父類不在同一包中,那麽在子類中,子類實例可以訪問其在父類中繼承而來的protected方法,而不能訪問父類實例的protected方法。

 4、繼承後的初始化順序:

  父類屬性——父類構造方法——子類屬性——子類構造方法

 5、在Java中,繼承只能單繼承,不能多重繼承。

  但是,可以多層繼承:

  例如:

    public class Test1{}

    public class Test2 extends Test1{}

    public class Test3 extends Test2{}

    此時,Test3就可以得到Test2和Test1兩個類中的非私有屬性。

二、封裝

 1、屬性的封裝

  1)、將類的屬性進行私有化處理,不允許外部程序進行直接訪問。並對外提供統一的方法用於設置和讀取私有屬性;

  2)、實現訪問控制,限制屬性訪問。但,不是拒絕訪問。

    作用:只能通過規定的方法訪問數據,方便在方法中加入控制語句,防止不合法數據賦值。

    get()、set()方法訪問private屬性 ↓

    示例:     

      public String getName() {
        return name;
      }

      public void setName(String name) {
        this.name = name;
      }

      public String getSex() {
        return sex;
      }

      public void setSex(String sex) {
        this.sex = sex;
      }

       public int getAge(){
        return age;
       }
      public void setAge(int age){
        this.age=age;
      } 

 2、封裝

  除了屬性的封裝之外,將需要重復使用的代碼提取到方法中,這叫方法的封裝。

  將相同的屬性和方法抽象成一個類,這也是封裝的思想。

三、多態

 1、多態:同一種事物,由於條件的不同,展示出不同的結果,叫做多態;

   示例:

     英國人說英國話,中國人說中國話,這不叫多態。

     同樣是人,有人說中國話,有人說英國話,這就是多態。

 2、程序中的多態:同一個引用類型,由於使用不同的對象實例,而執行不同的操作。

  實例:

    Chinese c = new Chinese(); c.say();

    English e = new English(); e.say();

    → 英國人說英國話,中國人說中國話,這不叫多態。

    Person p = new Chinese(); p.say();

    Person p = new English(); p.say();

    → 同樣是人,有人說中國話,有人說英國話,這就是多態。

 3、實現多態的條件:

  ① 子類繼承父類;

  ② 子類重寫父類方法;

  ③ 父類引用指向子類對象。 // 保證:同一個父類引用類型,使用不同的子類對象實例,而執行不同的操作。

以上便是面向對象的三大特征!

附:

 方法重載和方法重寫:

            位置 方法名 返回值 參數列表 訪問控制符

  override方法重寫: 子類 相同 相同 相同 不能比父類更嚴格

  overload方法重載: 本類 相同 無關 不同 無關

 註意:由於子類無法繼承父類的私有屬性,因此父類中的private方法無法被重寫。

談面向對象的三大特征