面向對象——OOP(二)(封裝、繼承、多態、抽象、接口)

面向對象三大特徵之一: 封裝:Encapsulation,封裝和隱藏
●  緣由 :使用者對定義的屬性(成員變量)直接操作會導致數據的錯誤、混亂或安全性問題
●  辦法 :隱藏不需要對外提供的實現細節,使用者只能通過事先定製好的方法來訪問
●  實現 :將屬性聲明爲私有的,再提供公共的方法實現對該屬性的操作

注意:好處:可以方便地加入控制邏輯,限制對屬性的不合理操作。便於修改,增強代碼的可維護性
------------------------------------------------------------------------------------------------------------------
面向對象三大特徵之二: 繼承:Inheritance
●  多個類中存在相同屬性和行爲時,將這些內容抽取到一個新類中,多個類無需再定義這些屬性和行爲,只要繼承那個類即可(多個類稱爲子類,單獨的這個類稱爲父類(基類或超類))
●  子類會把父類除構造器之外的所有信息給繼承下來
●  子父類的概念是相對的(子類也可以作爲其他類的父類,父類也可以作爲其他類的子類)
●  子類可以有自己特有屬性和方法也可以重寫父類定義的方法
●  子類是父類的擴展

●  語法 修飾符  class  類名(子類)  extends  類名(父類){ }
●  作用 :提高了代碼的複用性,讓類與類之間產生了關係,提供了多態的前提
注意:java類是單繼承,不支持多繼承(接口支持多繼承)。子類不能直接訪問父類中私有的(private)的成員變量和方法。只能通過事先定製好的方法來訪問(如:get、set方法)。當一個類沒有顯示的指明父類時,那麼它的父類是java.lang.Object(此類是所有類型基類)。不要僅爲了獲取其他類中某個功能而去繼承
------------------------------------------------------------------------------------------------------------------
繼承之方法的重寫: override,父類的方法對子類不適用,那麼子類可以對父類的方法重寫(重置、覆蓋 ))
●  子父類方法必須具有相同的方法名稱、參數列表、返回值類型
●  子類必須大於等於父類的權限修飾符
●  子類方法拋的異常類型不能大於父類被重寫方法的異常
●  子父類的方法必須同爲static或同爲非static

●  子類方法中訪問被被重寫了的父類方法 super.方法名(參數)
●  子類方法中訪問沒有被重寫的父類方法 super.方法名(參數) 或者 方法名(參數)
注意:當子類重寫了父類的方法後,如果使用子類的對象調用被重寫的方法,調用的是子類中重寫的方法,如果子類沒有重寫父類的方法,則調用的是父類中的方法
------------------------------------------------------------------------------------------------------------------
面向對象三大特徵之三: 多態:Polymorphism,指一個事物存在多種形態
表現形式:
●  方法的重載(overload)和重寫(override)
●  對象的多態性:父類的引用指向子類的對象  如:Person(父類)p1 = new Woman()(子類);
多態的前提:
●  繼承關係
●  子類重寫了父類的方法
多態在程序運行分爲: (編譯時「看左邊」,運行時「看右邊」)
●  編譯狀態 :關注是父類。子類特有的屬性和方法不能被編譯通過
●  運行狀態 :關注的是子類(真正對象的實體,子類的對象,那麼執行的方法就是子類重寫的方法)

注意:在多態下,調用方法實際執行的是子類重寫父類的方法,無法執行子類特有的屬性和方法,如果想執行,使用強轉符「( )」
------------------------------------------------------------------------------------------------------------------
多態之instanceof:
●  語法 x  instanceof  A (檢驗x是否爲類A的對象,返回值爲boolean型)
●  要求x所屬的類與類A必須是子類和父類的關係,否則編譯錯誤
●  如果x屬於類A的子類B,x  instanceof  A也爲true

------------------------------------------------------------------------------------------------------------------

抽象類:abstract
繼承過後,子類變得越來越具體,父類則更一般,更通用。有時將父類設計得非常抽象,以至於它沒有具體的實例,這樣的類叫做抽象類
抽象類:可以定義和普通類完全一樣的內容
●  語法權限修飾符  abstract  class  類名稱{ }
●  不能被實例化,用來被繼承。子類必須重寫父類的抽象方法,才能被實例化
●  有構造器(所以的類都有構造器)
●  抽象類中不一定有抽象方法
抽象方法:只有方法的聲明,沒有方法的實現。在定義抽象方法時沒有方法體和{ },結尾分號結束
●  語法權限修飾符  abstract  void(或者返回值類型) 方法名(形參列表);
●  抽象方法所在的類一定是抽象類
●  子類如果繼承的是抽象的父類(有抽象方法),那麼子類必須重寫父類的所有抽象方法或者子類也是一個抽象類
●  若子類繼承抽象類,並重寫所有的抽象方法,則此類是一個「實體類」,即可以實例化

注意:不能用abstract修飾屬性、私有方法、構造器、靜態方法、final的方法

------------------------------------------------------------------------------------------------------------------

接口:interface:抽象方法和常量值定義的集合
接口是一種特殊的抽象類,只包含常量和方法的定義,沒有具體的實現。主要用途就是被實現類實現(面向接口編程)
●  接口類語法權限修飾符  interface  接口名稱{ }
●  常量(成員變量)語法public  static  final  數據類型  常量名 = 值(其中public  static  final可以省略,爲默認)
●  抽象方法語法public  abstract  void(或者返回值類型)方法名(形參列表)(其中public  abstract可以省略,爲默認)
●  實現接口語法權限修飾符  class  類名稱  implements  接口名稱{ }(實現多個接口,接口名稱之間使用「,」分隔)
●  實現類可以繼承父類也可以實現接口語法權限修飾符  class  實現類  extends  父類  implements  接口名稱{ }
●  對象的引用語法接口名稱  變量名 = new  實現類的名稱(接口與實現類之間也存在多態性)

注意:接口沒有構造器。它是多繼承機制(多個接口使用「,」分隔,類是單繼承)。如果沒有完全重寫接口中的抽象方法,那麼這個類一定是抽象類。反之,全部重寫,那麼它就是一個實體類,可以實例化。在接口中的常量必須初始化值

------------------------------------------------------------------------------------------------------------------

接口總結:
●  可以實現不相關類的相同行爲,而不需要考慮這些類之間的層次關係
●  可以指明多個類需要實現的方法,一般用於定義對象的擴張功能
●  主要用來定義規範。解除耦合關係
------------------------------------------------------------------------------------------------------------------
接口和抽象類之間的關係:

注意:在開發中,一個類不要去繼承一個已經實現好的類,要麼繼承抽象類,要麼實現接口
------------------------------------------------------------------------------------------------------------------

自己整理,有些地方是扒拉的,如有侵犯,還望告知