面向?qū)ο?/h2>

一、面向?qū)ο蠛兔嫦蜻^程

  • 面向過程(POP,Procedure Oriented Programming)
    強調(diào)的是功能行為,以函數(shù)為最小單位,考慮怎么做。
  • 面向?qū)ο螅∣OP,Object Oriented Programming)
    將功能封裝進對象,強調(diào)具備了功能的對象,以類/對象為最小單位,考慮誰來做。程序員從面向過程的執(zhí)行者轉(zhuǎn)化成面向?qū)ο蟮闹笓]者。

二、面向?qū)ο蟮娜筇卣?/h2>

1.封裝

我們程序設(shè)計追求“高內(nèi)聚,低耦合”。

  • 高內(nèi)聚 :類的內(nèi)部數(shù)據(jù)操作細節(jié)自己完成,不允許外部干涉;
  • 低耦合 :僅對外暴露少量的方法用于使用。

隱藏對象內(nèi)部的復雜性,只對外公開簡單的接口。便于外界調(diào)用,從而提高系統(tǒng)的可擴展性、可維護性。通俗的說,把該隱藏的隱藏起來,該暴露的暴露出來。這就是封裝性的設(shè)計思想。

2.繼承
  • 為什么要有繼承?
    多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那個類即可。
    此處的多個類稱為子類( 派生類),單獨的這個類稱為父類(基類或超類)。
    可以理解為:“子類 is a 父類
  • 類繼承語法規(guī)則:
    class Subclass extends SuperClass{ }
  • 作用:
    繼承的出現(xiàn)減少了代碼冗余,提高了代碼的復用性。
    繼承的出現(xiàn),更有利于功能的擴展。
    繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系,提供了多態(tài)的前提。
    注意:不要僅為了獲取其他類中某個功能而去繼承
3.多態(tài)

多態(tài)性,是面向?qū)ο笾凶钪匾母拍睢?br> 對象的多態(tài)性:父類的引用指向子類的對象 ??梢灾苯討?yīng)用在抽象類和接口上。

  • 多態(tài)作用
    提高了代碼的通用性,常稱作接口重用
  • 前提
    1.需要存在繼承或者實現(xiàn)關(guān)系
    2.有方法的重寫
  • 成員方法
    編譯時:要查看引用變量所聲明的類中是否有所調(diào)用的方法。
    運行時:調(diào)用實際new的對象所屬的類中的重寫方法。
  • 成員變量
    不具備多態(tài)性,只看引用變量所聲明的類。
  • 編譯時類型和運行時類型
    Java引用變量有兩個類型: 編譯時類型和運行時類型。編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的對象決定。簡稱:編譯時,看左邊;運行時,看右邊。
    若編譯時類型和運行時類型不一致 , 就出現(xiàn)了對象的多態(tài)性 (Polymorphism)
    多態(tài)情況下 :
    “ 看左邊 ” ,看的是父類的引用(父類中不具備子類特有的方法)
    “ 看右邊 ” ,看的是子類的對象(實際運行的是子類重寫父類的方法)

注意:一個引用類型變量如果聲明為父類的類型,但實際引用的是子類對象,那么該變量就不能再訪問子類中添加的屬性和方法。
舉例:
Student m = new Student();
m.school = “pku”; // 合法,Student 類有school 成員變量
Person e = new Student();
e.school = “pku”; // 非法,Person 類沒有school 成員變量
屬性是在編譯時確定的,編譯時e 為Person 類型,沒有school 成員變量,因而編譯錯誤。

  • 靜態(tài)綁定和動態(tài)綁定(早綁定和晚綁定)
    對于重載而言,在方法調(diào)用之前,編譯器就已經(jīng)確定了所要調(diào)用的方法,這稱為“早綁定”或“靜態(tài)綁定”;
    而對于多態(tài),只有等到方法調(diào)用的那一刻,解釋運行器才會確定所要調(diào)用的具體方法,這稱為“晚綁定”或“動態(tài)綁定”。
    引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚綁定,它就不是多態(tài)?!?br> 子類中定義了與父類同名同參數(shù)的方法,在多態(tài)情況下,將此時父類的方法稱為虛擬方法,父類根據(jù)賦給它的不同子類對象,動態(tài)調(diào)用屬于子類的該方法。這樣的方法調(diào)用在編譯期是無法確定的。
    Person e = new Student();
    e.getInfo(); // 調(diào)用Student 類的getInfo() 方法
    編譯時e 為Person 類型,而方法的調(diào)用是在運行時確定的,所以調(diào)用的是Student類的getInfo() 方法,此即為動態(tài)綁定。
  • 對象類型轉(zhuǎn)換
    1.基本數(shù)據(jù)類型的轉(zhuǎn)換
    自動類型轉(zhuǎn)換:小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成大的數(shù)據(jù)類型
    如long g=20; double d=12.0f
    強制類型轉(zhuǎn)換:可以把大的數(shù)據(jù)類型強制轉(zhuǎn)換成小的數(shù)據(jù)類型
    如 float f=(float)12.0; int a=(int)1200L
    2.引用數(shù)據(jù)類型的轉(zhuǎn)換
    從子類到父類的類型轉(zhuǎn)換可以自動進行
    從父類到子類的類型轉(zhuǎn)換必須通過造型( 強制類型轉(zhuǎn)換) 實現(xiàn)
    ps:
    1)對Java 對象的強制類型轉(zhuǎn)換稱為造型
    2)在造型前可以使用instanceof進行判斷
    3)無繼承關(guān)系的引用類型間的轉(zhuǎn)換是非法的
    對象類型轉(zhuǎn)換.png
  • instanceof 操作符
    x instanceof A :檢驗x 是否為類A 的對象,返回值為boolean 型。
    注意:要求x所屬的類與類A必須是子類和父類的關(guān)系,否則編譯錯誤。
    舉例:
    public class Person extends Object {…}
    public class Student extends Person {…}
    public class Graduate extends Person {…}
public void method(Person e) {
if (e instanceof Person)
//  處理Person 類及其子類對象
if (e instanceof Student)
// 處理Student 類及其子類對象
if (e instanceof Graduate)
// 處理Graduate 類及其子類對象
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容