1. 程式人生 > 實用技巧 >5. Java 面向物件

5. Java 面向物件

Java 面向物件

1. 什麼是面向物件

  • Java 的核心思想就是:OOP

1.1 面向過程 與 面向物件

  • 面向過程

    步驟清晰簡單,按步驟執行

  • 面向物件

    物以類聚,分類的思維模式。面對問題先分類,再單一思考,對最後的細節進行面向過程的思索

    適合處理複雜的事物

  • 巨集觀上,通過面向物件的思路分析;微觀上,通過面向過程的思路出路

面向過程和麵向物件的區別

  • 面向過程:效能優於面向物件。
  • 面向物件:易維護、易擴充套件、易複用

面向過程效能比面向物件高?

  • 由於Java是半編譯語言,最終的執行程式碼不是CPU可執行的二進位制機器碼。
  • 而面向過程的語言大多數是直接編譯成機器碼來執行,但是有一些指令碼語言效能也不一定比Java好。

1.2 什麼是面向物件

  • 面向物件程式設計:OOP (Object-Oriented Programming)
  • 面向物件的本質:以類的方式組織程式碼,以物件的形式封裝資料。
  • 抽象
  • 三大特性
    • 封裝
    • 繼承
    • 多型
  • 從認識的角度先有物件 後有 類。類是抽象的,是對物件的抽象
  • 從程式碼的角度是先有類再有物件

1.3 方法

  • 靜態方法與類一起載入的,非靜態方法物件例項化之後才載入。因此靜態方法可直接通過類呼叫。

2. 建立物件

  • 使用 new 關鍵字建立物件
  • 建立物件時除了分配記憶體空間外,還會給 建立好的物件 進行預設的初始化以及對類中的構造器的呼叫
  • 類中的構造器也稱為構造方法,是建立物件時 必須要呼叫的。
  • 構造方法的特點
    1. 必須與類的名字相同
    2. 必須沒有返回值型別,也不能寫 void
    3. 建構函式分為:無參構造和有參構造
  • 建構函式的作用
    1. new 本質再呼叫建構函式
    2. 初始化物件的值

2.1 小結

  • 類與物件

    類是抽象的,物件是例項化的物件

    類的屬性

    1. 靜態的屬性:
    2. 動態的行為:方法
  • 物件的引用:物件是通過引用來操作的:棧--->堆

  • 物件的建立和使用

    1. 必須使用 new 關鍵字,構造器
    2. 物件的屬性

3. 三大特性

  • 程式設計追求 高內聚,低耦合
    • 高內聚:類的內部資料操作細節自己完成,不允許外部干涉
    • 低耦合:僅暴露少量的方法給外部使用

3.1 封裝

  • (資料的隱藏)通常,應禁止直接訪問一個物件中資料的實際表示,而應通過介面來訪問

  • 屬性私有:get / set

  • 封裝的作用

    • 提高了程式碼的安全性
    • 隱藏了程式碼的實現細節
    • 統一介面
    • 可維護性提高了

3.2 繼承

  • 繼承的本質是某一批類的抽象,從而實現更好的建模
  • extends ; 子類是父類的擴充套件
  • Java 只可以單繼承
  • 所有的類都直接或者間接繼承 Object

關鍵點:

  • super 注意點

    1. super 呼叫父類的構造方法,必須在構造方法的第一個
    2. super 必須只能出現在子類的方法或者構造方法中
    3. super 和 this 不能同時呼叫構造方法
  • this

    • 代表的物件不同
      • this 本身呼叫者這個物件
      • super 代表父類物件的應用
    • 前提
      • this 沒有繼承也可使用
      • super 只能在繼承條件才可使用
    • 構造方法
      • this 本類的構造方法
      • super 父類的構造方法

3.3 多型

  • 父類的引用指向子類的例項 Person person = new Student();
  • 即同一個方法可以根據傳送物件的不同而採用多種不同的行為方式
  • 一個物件的型別是確定的,但是可以指向對應的引用型別有很多
  • 多型是 方法 的多型,屬性沒有多型
  • 父類與子類 有聯絡
  • 多型存在的條件
    1. 存在繼承關係
    2. 方法必須重寫
    3. 父類的引用指向子類物件
  • new 左邊是引用型別,右邊是實際型別。而物件能使用的方法看引用型別

instanceof

  • 判斷兩個類之間是否存在父子關係

static

  • 類載入時就被載入,且只加載一次

4. 修飾符

  • public:公有的
  • protected:受保護的
  • private:私有的
  • static:靜態
  • final:修飾常量
  • abstract:抽象

在一個靜態方法中,呼叫一個非靜態成員為什麼是非法的?

  • 因為靜態方法隨著類載入就已經初始化完成了,而非靜態成員需在物件例項化之後才完成初始化,所以沒法調。

靜態方法 和 例項方法的不同

  • 靜態方法 可以以 類名.方法名 呼叫,而例項方法不可以,必須例項化之後
  • 靜態方法隨著類載入就已經初始化完成了

4.1 常用關鍵字:

  • static
  • final
  • this
  • super

5. 抽象類

  • Java 的類是單繼承的,介面是可以多繼承的
  • 抽象類不能new, 只能靠子類去實現。約束
  • 抽象類可以寫普通方法,抽象方法必須存在抽象類中

6. 介面

  • 定義:interface
  • 介面都需要有實現類
  • 介面的作用:
    1. 約束
    2. 定義一些方法讓不同的人實現
    3. 方法都是 public abstract
    4. 常量都是 public static final
    5. 介面不能被例項化,因為介面中沒有構造方法

介面和抽象類的區別

  • 介面的方法預設是public, 抽象類中可以有public, protected, default 這些。(不能有private , 抽象類的方法就是為了要被重寫)
  • 介面中的方法不能有實現(jdk8 可以有預設實現),抽象類可以有非抽象的方法
  • 一個類可以有多個介面,但只能實現一個抽象類。

7. 內部類

  • 區域性內部類
  • 靜態內部類:方法外面,類裡面
  • 13匿名內部類:方法裡面