面向對象基本概念

面向對象編程的概念

  • 萬物皆對象。
  • 面向對象指以屬性行為的觀點去分析現(xiàn)實生活中的事物。
  • 面向對象編程指先以面向對象的思想進行分析,然后使用面向對象的編程語言 進行表達的過程。
  • 面向對象編程是軟件產(chǎn)業(yè)化發(fā)展的需求。
  • 理解面向對象的思想精髓(封裝繼承、多態(tài)),

類和對象

  • 對象主要指現(xiàn)實生活中客觀存在的實體,在Java語言中對象體現(xiàn)為內(nèi)存空間中的一塊存儲區(qū)域。
  • 類簡單來就是“分類” ,是對具有相同特征和行為的多個對象共性的抽象描述,在Java語言中體現(xiàn)為一種引用數(shù)據(jù)類型,里面包含了描述特征/屬性 的成員變量以及描述行為的成員方法
  • 類是用于構建對象的模板,對象的數(shù)據(jù)結構由定義它的類來決定。

封裝

封裝的概念
  • 通常情況下可以在測試類給成員變量賦值一些合法但不合理的數(shù)值,無論是編譯階段還是運行階段都不會報錯或者給出提示,此時與現(xiàn)實生活不符。
  • 為了避免上述錯誤的發(fā)生,就需要對成員變量進行密封包裝處理,來隱 藏成員變量的細節(jié)以及保證成員變量數(shù)值的合理性,該機制就叫做封裝。
封裝的實現(xiàn)流程
  • 私有化成員變量,使用private關鍵字修飾。
  • 提供公有的get和set方法,并在方法體中進行合理值的判斷。
  • 在構造方法中調用set方法進行合理值的判斷。

構造方法

構造方法的基本概念

構造方法名與類名完全相同并且沒有返回值類型,連void都不許有。

class 類名 {
    類名(形參列表) {
         構造方法體;
    }
}
class Person {
    Person() { 
        // Person類中的構造方法
    }
} 
默認構造方法
  • 當一個類中沒有定義任何構造方法時,編譯器會自動添加一個無參空構 造構造方法,叫做默認/缺省構造方法,如:Person(){}
  • 若類中出現(xiàn)了構造方法,則編譯器不再提供任何形式的構造方法。
構造方法的作用

使用new關鍵字創(chuàng)建對象時會自動調用構造方法實現(xiàn)成員變量初始化工作。

方法重載

方法重載的概念

若方法名稱相同,參數(shù)列表不同,這樣的方法之間構成重載關系 (Overload)。

重載的體現(xiàn)形式
  • 方法重載的主要形式體現(xiàn)在:參數(shù)的個數(shù)不同、參數(shù)的類型不同、參數(shù) 的順序不同,與返回值類型和形參變量名無關,但建議返回值類型最好 相同。
  • 判斷方法能否構成重載的核心:調用方法時能否加以區(qū)分。
重載的實際意義
  • 方法重載的實際意義在于調用者只需要記住一個方法名就可以調用各種 不同的版本,來實現(xiàn)各種不同的功能。
  • 如:java.io.PrintStream類中的println方法。

this關鍵字

this的基本概念
  • 若在構造方法中出現(xiàn)了this關鍵字,則代表當前正在構造的對象。
  • 若在成員方法中出現(xiàn)了this關鍵字,則代表當前正在調用的對象。
  • this關鍵字本質上就是當前類類型的引用變量。
工作原理

在構造方法中和成員方法中訪問成員變量時,編譯器會加上this.的前綴, 而this.相當于漢語中"我的",當不同的對象調用同一個方法時,由于調用 方法的對象不同導致this關鍵字不同,從而this.方式訪問的結果也就隨之 不同。

使用方式
  • 當局部變量名與成員變量名相同時,在方法體中會優(yōu)先使用局部變量(就近原則),若希望使用成員變量,則需要在成員變量的前面加上this.的前 綴,明確要求該變量是成員變量(重中之重)。
  • this關鍵字除了可以通過this.的方式調用成員變量和成員方法外,還可以 作為方法的返回值(重點)。
  • 在構造方法的第一行可以使用this()的方式來調用本類中的其它構造方法 (了解)。
注意事項
  • 引用類型變量用于存放對象的地址,可以給引用類型賦值為null表示不指向任何對象。
  • 當某個引用類型變量為null時無法對對象實施訪問(因為它沒有指向任何 對象)。此時,如果通過引用訪問成員變量或調用方法,會產(chǎn)生 NullPointerException 異常。

繼承

繼承的概念

當多個類之間有相同的特征和行為時,可以將相同的內(nèi)容提取出來組成 一個公共類,讓多個類吸收公共類中已有特征和行為而在多個類型只需要編寫自己獨有特征和行為的機制,叫做繼承。

在Java語言中使用extends(擴展)關鍵字來表示繼承關系。

如: public class Worker extends Person{} - 表示W(wǎng)orker類繼承自Person類 其中Person類叫做超類、父類、基類。 其中Worker類叫做派生類、子類、孩子類。

使用繼承提高了代碼的復用性,可維護性及擴展性,是多態(tài)的前提條件。

繼承的特點
  • 子類不能繼承父類的構造方法和私有方法,但私有成員變量可以被繼承只是不能直接訪問。
  • 無論使用何種方式構造子類的對象時都會自動調用父類的無參構造方法, 來初始化從父類中繼承的成員變量,相當于在構造方法的第一行增加代 碼super()的效果。
  • 使用繼承必須滿足邏輯關系:子類 is a 父類,也就是不能濫用繼承。
  • Java語言中只支持單繼承不支持多繼承,也就是說一個子類只能有一個父 類,但一個父類可以有多個子類。
方法重寫的概念

從父類中繼承下來的方法不滿足子類的需求時,就需要在子類中重新寫 一個和父類一樣的方法來覆蓋從父類中繼承下來的版本,該方式就叫做 方法的重寫(Override)。

方法重寫的原則
  • 要求方法名相同、參數(shù)列表相同以及返回值類型相同,從Java5開始允許返回子類類型
  • 要求方法的訪問權限不能變小,可以相同或者變大
  • 要求方法不能拋出更大的異常(異常機制)。

訪問控制

常用的訪問控制符
修飾符 本類 同一個包中的類 子類 其他類
public 可以訪問 可以訪問 可以訪問 可以訪問
protected 可以訪問 可以訪問 可以訪問 不能訪問
默認 可以訪問 可以訪問 不能訪問 不能訪問
private 可以訪問 不能訪問 不能訪問 不能訪問
注意事項
  • public修飾的成員可以在任意位置使用。
  • private修飾的成員只能在本類內(nèi)部使用。
  • 通常情況下,成員方法都使用public關鍵字修飾,成員變量都使用private 關鍵字修飾。

final關鍵字

基本概念

final本意為"最終的、不可改變的",可以修飾類、成員方法以及成員變量。

使用方式
  • final關鍵字修飾類體現(xiàn)在該類不能被繼承。 - 主要用于防止濫用繼承,如:java.lang.String類等。
  • final關鍵字修飾成員方法體現(xiàn)在該方法不能被重寫但可以被繼承。 - 主要用于防止不經(jīng)意間造成重寫,如:java.text.Dateformat類中format方法等。
  • final關鍵字修飾成員變量體現(xiàn)在該變量必須初始化且不能改變。 - 主要用于防止不經(jīng)意間造成改變,如:java.lang.Thread類中MAX_PRIORITY等。(初始化方式:直接初始化,構造塊中初始化,構造方法體中初始化)
常量的概念
  • 在以后的開發(fā)中很少單獨使用final關鍵字來修飾成員變量,通常使用 public static final關鍵字共同修飾成員變量來表達常量的含義,常量的命名規(guī)范要求是所有字母都要大寫,不同的單詞之間采用下劃線連接。
  • ? public static final double PI = 3.14;

多態(tài)

多態(tài)的概念
  • 多態(tài)主要指同一種事物表現(xiàn)出來的多種形態(tài)。
  • 飲料:可樂、雪碧、紅牛、脈動、...
多態(tài)的語法格式

父類類型 引用變量名 = new 子類類型(); 如: Shape sr = new Rect(); sr.show();

多態(tài)的特點
  • 當父類類型的引用指向子類類型的對象時,父類類型的引用可以直接調用父類獨有的方法。
  • 當父類類型的引用指向子類類型的對象時,父類類型的引用不可以直接調用子類獨有的方法。
  • 對于父子類都有的非靜態(tài)方法來說,編譯階段調用父類版本,運行階段調用子類重寫的版本(動態(tài)綁定)。
  • 對于父子類都有的靜態(tài)方法來說,編譯和運行階段都調用父類版本
引用數(shù)據(jù)類型之間的轉換
  • 引用數(shù)據(jù)類型之間的轉換方式有兩種:自動類型轉換 和 強制類型轉換。
  • 自動類型轉換主要指小類型向大類型的轉換,也就是子類轉為父類,也 叫做向上轉型。
  • 強制類型轉換主要指大類型向小類型的轉換,也就是父類轉為子類,也 叫做向下轉型或顯式類型轉換。
  • 引用數(shù)據(jù)類型之間的轉換必須發(fā)生在父子類之間,否則編譯報錯。
  • 若強轉的目標類型并不是該引用真正指向的數(shù)據(jù)類型時則編譯通過,運行階段發(fā)生類型轉換異常。 (ClassCastException 類型轉換異常)
  • 為了避免上述錯誤的發(fā)生,應該在強轉之前進行判斷,格式如下: if(引用變量 instanceof 數(shù)據(jù)類型) 判斷引用變量指向的對象是否為后面的數(shù)據(jù)類型
多態(tài)的實際意義

多態(tài)的實際意義在于屏蔽不同子類的差異性實現(xiàn)通用的編程帶來不同的效果。

多態(tài)的使用場合
  • 通過方法的參數(shù)傳遞形成多態(tài); public static void draw(Shape s){ s.show(); } draw(new Rect(1, 2, 3, 4));
  • 在方法體中直接使用多態(tài)的語法格式 Account acc = new FixedAccount();
  • 通過方法的返回值類型形成多態(tài) Calender getInstance(){ return new GregorianCalendar(zone, aLocale); }

抽象類

抽象方法的概念
  • 抽象方法主要指不能具體實現(xiàn)的方法并且使用abstract關鍵字修飾,也就 是沒有方法體。(abstract 不能和final,static同時使用)
  • 具體格式如下: 訪問權限 abstract 返回值類型 方法名(形參列表); public abstract void cry();
  • 抽象類主要指不能具體實例化的類并且使用abstract關鍵字修飾,也就是不能創(chuàng)建對象。
抽象類和抽象方法的關系
  • 抽象類中可以有成員變量、構造方法、成員方法
  • 抽象類中可以沒有抽象方法,也可以有抽象方法
  • 擁有抽象方法的類必須是抽象類,因此真正意義上的抽象類應該是具有 抽象方法并且使用abstract關鍵字修飾的類。
抽象類的實際意義
  • 抽象類的實際意義不在于創(chuàng)建對象而在于被繼承。
  • 當一個類繼承抽象類后必須重寫抽象方法,否則該類也變成抽象類,也 就是抽象類對子類具有強制性和規(guī)范性,因此叫做模板設計模式。
開發(fā)經(jīng)驗分享
  • 在以后的開發(fā)中推薦使用多態(tài)的格式,此時父類類型引用直接調用的所 有方法一定是父類中擁有的方法,若以后更換子類時,只需要將new關鍵 字后面的子類類型修改而其它地方無需改變就可以立即生效,從而提高 了代碼的可維護性和可擴展型。
  • 該方式的缺點就是:父類引用不能直接調用子類獨有的方法,若調用則 需要強制類型轉換。

接口

接口的基本概念
  • 接口就是一種比抽象類還抽象的類,體現(xiàn)在所有方法都為抽象方法。
  • 定義類的關鍵字是class,而定義接口的關鍵字是interface。
類和接口之間的關系
名稱 關鍵字 關系
類和類之間的關系 使用extends關鍵字表達繼承關系 支持單繼承
類和接口之間的關系 使用implements關鍵字表達實現(xiàn)關系 支持多實現(xiàn)
接口和接口之間的關系 使用extends關鍵字表達繼承關系 支持多繼承
抽象類和接口的主要區(qū)別
  • 定義抽象類的關鍵字是abstract class,而定義接口的關鍵字是interface。
  • 繼承抽象類的關鍵字是extends,而實現(xiàn)接口的關鍵字是implements。
  • 繼承抽象類支持單繼承,而實現(xiàn)接口支持多實現(xiàn)。
  • 抽象類中可以有構造方法,而接口中不可以有構造方法。
  • 抽象類中可以有成員變量,而接口中只可以有常量。
  • 抽象類中可以有成員方法,而接口中只可以有抽象方法。
  • 抽象類中增加方法時子類可以不用重寫,而接口中增加方法時實現(xiàn)類需 要重寫(Java8以前的版本)。
  • 從Java8開始增加新特性,接口中允許出現(xiàn)非抽象方法和靜態(tài)方法,但非 抽象方法需要使用default關鍵字修飾。
  • 從Java9開始增加新特性,接口中允許出現(xiàn)私有方法。

static關鍵字

基本概念
  • 使用static關鍵字修飾成員變量表示靜態(tài)的含義,此時成員變量由對象層級提升為類層級,也就是整個類只有一份并被所有對象共享,該成員變量隨著類的加載準備就緒,與是否創(chuàng)建對象無關。
  • static關鍵字修飾的成員可以使用引用.的方式訪問,但推薦類名.的方式。
使用方式
  • 在非靜態(tài)成員方法中既能訪問非靜態(tài)的成員又能訪問靜態(tài)的成員。 (成員:成員變量 + 成員方法, 靜態(tài)成員被所有對象共享)
  • 在靜態(tài)成員方法中只能訪問靜態(tài)成員不能訪問非靜態(tài)成員(不能使用this關鍵字)。 (成員:成員變量 + 成員方法, 因為此時可能還沒有創(chuàng)建對象)
  • 在以后的開發(fā)中只有隸屬于類層級并被所有對象共享的內(nèi)容才可以使用 static關鍵字修飾。(不能濫用static關鍵字)
構造塊和靜態(tài)代碼塊(熟悉)
  • 構造塊:在類體中直接使用{}括起來的代碼塊。
  • 每創(chuàng)建一個對象都會執(zhí)行一次構造塊。
  • 靜態(tài)代碼塊:使用static關鍵字修飾的構造塊。
  • 靜態(tài)代碼塊隨著類加載時執(zhí)行一次
public class SuperTest {
    {
        System.out.println("SuperTest中的構造塊");  // step3
    }
    static {
        System.out.println("SuperTest中的靜態(tài)構造塊"); // step1
    }
    public SuperTest(){
        System.out.println("SuperTest中的構造方法體");// step4
    }

    public static void main(String[] args) {
        SuperTest superTest=new SuperTest();

    }
}
public class SubSuperTest extends SuperTest {
    {
        System.out.println("=====SubSuperTest中的構造塊");  // step5
    }
    static {
        System.out.println("=====SubSuperTest中的靜態(tài)構造塊"); // step2
    }
    public SubSuperTest(){
        System.out.println("=====SubSuperTest中的構造方法體");// step6
    }

    public static void main(String[] args) {
        SubSuperTest test=new SubSuperTest();
    }
}
//SuperTest中的靜態(tài)構造塊
//=====SubSuperTest中的靜態(tài)構造塊
//SuperTest中的構造塊
//SuperTest中的構造方法體
//=====SubSuperTest中的構造塊
//=====SubSuperTest中的構造方法體
- 先執(zhí)行父類的靜態(tài)代碼塊,再執(zhí)行子類的靜態(tài)代碼塊。 
- 執(zhí)行父類的構造塊,執(zhí)行父類的構造方法體。 
- 執(zhí)行子類的構造塊,執(zhí)行子類的構造方法體。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 結構化程序設計 在結構化程序設計中,采用自頂向下、逐步求精和模塊化的思想,將復雜的大問題層層分解為許多簡單的小問題...
    silasjs閱讀 1,083評論 0 3
  • 面向對象的基本概念 程序化結構設計 在程序化結構設計中,采用 自頂向下、逐步求精及模塊化 的思想 在編寫程序時,使...
    陳_MY閱讀 593評論 0 0
  • 面向對象的基本概念 1. 簡述 C 和 C++ 有何不同? 宏觀上: C 語言屬于面向過程語言,通過函數(shù)來實現(xiàn)程序...
    MinoyJet閱讀 1,169評論 0 0
  • 一基本特征 面向對象的基本特征有三個:封裝性,繼承性,多態(tài)性 封裝性 封裝是一種信息隱藏技術,封裝使數(shù)據(jù)和加工數(shù)...
    鄒小月閱讀 792評論 0 2
  • 面向對象的基本概念有對象、類、抽象、封裝、繼承、多態(tài)、接口、消息、組件、模式和復用等。 1.對象 對象是由數(shù)據(jù)及其...
    everfight閱讀 1,247評論 0 0

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