一文带你了解java面向对象的三大特性:继承、封装、多态
文章目錄
- 1.繼承
- 2.封裝
- 3.多態
本篇文章以同步到:https://www.bithachi.cn/posts/c72fe2cc.html
1.繼承
繼承是類與類的一種關系,子類擁有父類的所有(public,default,protected)屬性和方法,從而實現了代碼的復用。**
繼承與實現的區別:
? 繼承:子類與父類的繼承。如果多個類的某個部分的功能相同,那么可以抽象出一個類出來,把他們的相同部分都放到父類里,讓他們都繼承這個類。
? 實現:接口的實現。如果多個類都有一個行為,但是處理的方法方式不同,那么就定義一個接口,也就是一個標準,讓各個類分別實現這個接口,各自實現自己具體的處理方法。
? 繼承:extends,實現:implements
? 單繼承,多實現。
? 在接口中只能定義全局常量(public static final ),和空的方法體;而在繼承中可以定義屬性,方法等…
注*:JDK 1.8 以后,接口里可以有靜態方法和方法體了。*
? 某個接口被類實現時,在類中一定要實現接口中的抽象方法;而繼承則無需。
2.封裝
為什么需要封裝?
我要用洗衣機,只需要按一下開關和洗滌模式就可以了。有必要了解洗衣機內部的結構嗎?有必要碰電動機嗎?
如果我們把洗衣機的內部結構暴露出來,當我們使用的時候可能會誤操作,碰到一些核心部件更改了配置,導致洗衣機功能出現問題,不能正常工作,所以封裝就顯得很有必要,把需要暴露的暴露出來,比如洗衣機的一些按鈕和加水的地方,不需要的隱藏起來,比如發動機,內部芯片電線等,這樣就保證了洗衣機的穩定工作和安全性。
封裝性的設計思想:隱藏對象內部的復雜性,只對外公開簡單的接口。便于外界調用,從而提高系統的可擴展性、可維護性。把該隱藏的隱藏起來,該暴露的暴露出來。
封裝的程序設計意義:為了實現程序設計的“高內聚,低耦合”。
- 高內聚 :類的內部數據操作細節自己完成,不允許外部干涉;
- 低耦合 :僅對外暴露少量的方法用于使用。
例如:通過將數據聲明為私有的(private),再提供公共的(public)方法:getXxx() 和setXxx()實現對該屬性的操作,以實現高內聚與低耦合。
3.多態
Java中的多態主要指引用多態和方法多態。
引用多態:父類引用可以指向本類對象,也可指向子類對象。引用多態的強大主要體現在調用屬性、方法時,可以根據引用具體指向的對象去調用,例如:子類中重寫了父類方法。子類重寫父類的方法,在調用方法時根據引用指向的子類對象決定調用哪個具體的方法。
方法多態:方法多態的強大主要體現在可以根據調用時參數的不同,而自主匹配調用的方法,例如:重載。
方法重寫與重載的區別:
重寫:一般發生在有繼承關系的子類中,子類中定義了一個方法,其方法名、返回值類型、參數列表 與父類中某個方法一樣,此時就是子類中重寫(覆蓋)了父類的同名方法。
-
子類重寫的方法訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明為 public,那么在子類中重寫該方法就不能聲明為 protected。
-
子類方法拋出的異常不能大于父類被重寫方法的異常
-
子類不能重寫父類中聲明為private權限的方法
重載(Overloading):發生在同一個類中,存在 多個方法的方法名相同,參數列表不同。參數列表不同指的是參數個數、參數類型或者參數的順序不同。
-
被重載的方法可以聲明新的或更廣的檢查異常;
-
被重載的方法可以改變訪問修飾符;
-
被重載的方法返回類型可以不同;
子類與父類中同名同參數的方法必須同時聲明為非static的(即為重寫),或者同時聲明為
static的(不是重寫)。因為static方法是屬于類的,子類無法覆蓋父類的方法。
注意:
這里我們討論多態調用屬性和方法的規則:
這里假設兩個類Student extends Person ,父類是Person,子類是Student
Person 引用指向子類對象Student,Person p=new Student()
當p調用屬性時:p只能調用Person類的屬性,即使Student定義了一模一樣的屬性,p實際調用的也是Person類的屬性
當p調用方法時:
Student 沒有重寫Person的方法,那么p只能調用Person類里面的方法
Student 重寫了 Person的方法,那么p調用被子類重寫的方法時,p在編譯時是Person的方法,運行時是Student重寫的方法。
關于多態這里還要說明一點,關于對象的類型轉換:
- 從子類到父類的類型轉換可以自動進行; Person p=new Student()
- 從父類到子類的類型轉換必須通過 強制類型轉換實現;Student s=(Student)Person;
- 無繼承關系的引用類型間的轉換是非法的
- 在強制類型轉換之前可以使用instanceof
一段代碼體會一下:
public static void main(String[] args) {Object obj = "Hello";//向上轉型String objStr = (String) obj;//向下轉型System.out.println(objStr);Object objPri = new Integer(5);//向上轉型// 下面代碼運行時引發 ClassCastException 異常,// 因為 objPri 分配的對象不是String而是 new Integer(5)String str = (String) objPri;//向下轉型失敗}運行結果:
Hello Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat Random_name.sgm.thisandsuper.Student.main(Student.java:64)? 因為在對象強制類型轉換時,有可能會出現類型轉換異常ClassCastException,所以我們在向下轉型時需要檢查,我們可以使用instanceof進行檢查。
? x instanceof A :檢驗x 是否為類A 的對象,返回值為boolean
運行結果:
Object Person ------------- Object Person Student ------------- Object Person Student總結
以上是生活随笔為你收集整理的一文带你了解java面向对象的三大特性:继承、封装、多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows10+PicGo+七牛云+
- 下一篇: java中的关键字:this与super