1. 程式人生 > 實用技巧 >面向物件三大特性:封裝,繼承,多型

面向物件三大特性:封裝,繼承,多型

面向物件三大特性


封裝

  • 該露的露,該藏的藏

    • 我們程式設計要追求“高內聚,低耦合”。高內聚:類的內部資料操作細節自己完成,不允許外部干涉;低耦合:僅暴露少量的方法給外部使用。
  • 封裝(資料的隱藏)

    • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。
  • 記住這句話就夠了:屬性私有:get/set


繼承

  • 繼承的本質是對某一批類的抽象,從而實現對現實世界更好的建模

  • extends的意思是“擴充套件”。子類是父類的擴充套件。

  • Java中類只有單繼承,沒有多繼承!

  • 關係 學生是人,學生繼承人 學生類是子類/派生類

  • 繼承是類與類之間的一種關係。除此之外,類和類之間的關係還有依賴,組合,聚合等

  • public protected default private
    一般來講  只有屬性才會是private
    ctrl + H :顯示繼承關係
    
  • Java中所有的類 都預設直接或者間接繼承Object

  • super關鍵字:父類

    • 和this相對
    • 但父類私有的東西無法被繼承
    • 注意點:
      • 1.super呼叫父類的構造方法,必須在構造方法的第一個
      • 2.super必須只能出現在子類的方法或者構造方法中
      • 3.super和this不能同時呼叫構造方法
      • this()本類構造 super()呼叫父類構造
  • 子類預設呼叫父類無參構造

  • 方法重寫:重點 ------>多型

    • 重寫是方法的重寫,和屬性無關

    • //靜態方法和非靜態的方法區別很大
      //靜態方法的呼叫只和左邊,定義的資料型別有關
      //重寫只能是非靜態方法  IDEA會有個相應的標
      A a=new A();
      a.test();//A
      //父類的引用指向了子類
      B b=new A();
      b.test();//B
      
    • 重寫:需要有繼承關係,子類重寫父類的方法

      • 1.方法名必須相同
      • 2.引數列表必須相同
      • 3.修飾符:範圍可以擴大 public>protected>default>private
      • 4.丟擲異常:範圍可以被縮小,但不能被擴大;ClassNotFoundException-->Exception(大)
    • 為什麼需要重寫

      • 父類實現的功能子類不一定需要或者不一定滿足
    • 快捷鍵:Alt+Insert 選中override


多型

  • 即同一方法可以根據傳送物件的不同而採用多種不同的動作

  • 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多

    • new Student();
      new Person();
      
    • //可以指向的引用型別就不確定了,父類的引用指向子類
      //物件能執行哪些方法,主要看物件左邊的型別,和右邊關係不大!
      
      //Student能呼叫的方法都是自己的或者繼承父類的
      Student s1=new Student();
      //Person父型別 可以指向子類,但是不可以呼叫子類獨有的方法
      Person s2=new Student();
      Object s3=new Student();
      //物件能執行哪些方法 主要看物件左邊的型別 和右邊關係不大
      s2.eat();//子類重寫了父類的方法,執行了子類的方法
      s1.eat();
      
      總結:根據左邊型別進行呼叫 但是如果子類重寫了 會呼叫子類的
      
  • 多型注意事項:

    • 1.多型是方法的多型,屬性沒有多型
    • 2.父類和子類,必須有聯絡,否則型別轉換異常!ClassCastException!
    • 3.存在條件:繼承關係+方法需要重寫+父類的引用指向子類物件!
      • Father f1=new Son();
    • 注意:
      • 1.static 方法:屬於類,它不屬於例項 不能被重寫
      • 2.final 常量:不再被重寫
      • 3.private 方法:私有的不能被重寫
  • instanceof (型別轉換)引用型別

    • X instanceof Y
      • 編譯能不能通過 取決於X與Y是否存在父子關係
      • 最後結果對錯 取決於X指向的實際型別是不是Y的子型別

  • 型別之間的轉換

    • 基本資料型別 低轉高 強制轉換

    • 引用型別

      • Person person=new Student()
        //student將這個物件轉換為Student型別 我們就可以使用Student型別的方法了 
        Student student=(Student)person;
        student.go();
        Student student=new Student();
        student.go();
        Person person =student;//隱式低轉高
        ~~person.go()~~//資料(方法)丟失
        
      • 父類引用指向子類的物件

      • 把子類轉換為父類,向上轉型

      • 把父類轉換為子類,向下轉型,強制轉換

      • 方便方法的呼叫,減少重複的程式碼!簡潔