1. 程式人生 > 其它 >面向物件程式設計(oop)

面向物件程式設計(oop)

面向過程思想

  • 步驟清晰簡單,第一步做什麼,第二步做什麼....

  • 面對過程適合處理一些較為簡單的問題

面向物件思想

  • 物以類聚,分類的思維模式,思考問題首先會解決問題需要哪些分類,然後對這些分類進行單獨思考。最後,才對某個分類下的細節進行面向過程的思索。

  • 面向物件適合處理複雜的問題,適合處理需要多人協作的問題!

  對於描述複雜的事物,為了從巨集觀上把握、從整體上合理分析,我們需要使用面向物件的思路來分析整個系統。但是,具體到微觀操作,仍然需要面向過程的思路去處理。

什麼是面向物件

  • 面向物件程式設計(Object-Oriented Programming, 00P)

  • 面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的組織(封裝)資料。

  • 抽象

  • 三大特性

    • 封裝

    • 繼承

    • 多型

  • 從認識論角度考慮是先有物件後有類。物件,是具體的事物。類,是抽象的,是對物件的抽象

  • 從程式碼執行角度考慮是先有類後有物件。類是物件的模板。

類與物件的關係

  • 類是一種抽象的資料型別,它是對某-類事物整體描述/定義,但是並不能代表某一 個具體的事物.

    • 動物、植物、手機、電腦....

    • Person類、Pet類、 Car類等, 這些類都是用來描述/定義某-類具體的事物應該具備的特點和行為

  • 物件是抽象概念的具體例項

    • 張三就是人的一個具體例項,張三家裡的旺財就是狗的一個具體例項。

    • 能夠體現出特點,展現出功能的是具體的例項,而不是一個抽象的概念.

建立和初始化物件

  • 使用new關鍵字建立物件

  • 使用new關鍵字建立的時候,除了分配記憶體空間之外,還會給建立好的物件進行預設的初始化以及對類中構造器的呼叫。

  • 類中的構造器也稱為構造方法,是在進行建立物件的時候必須要呼叫的。並且構造器有以下倆個特點: .

    1. 必須和類的名字相同

    2. 必須沒有返回型別,也不能寫void

構造器:
  1.和類名相同
  2.沒有返回值
作用:
  1.本質是在呼叫構造方法
  2.初始化物件值
注意點
  定義有參構造之後,如果想使用無參構造方法,顯示的定義一個無參構造

alt + insert
this.   代表當前類

建立物件記憶體分析

 

 

面向物件小結

  1. 類與物件 類是一個模板: 抽象,物件是一個具體的例項

  2. 方法 定義、呼叫!

  3. 物件的引用 引用型別: 基本型別 (8) 物件是通過引用來操作的:棧--->堆(地址)

  4. 屬性: 欄位Field 成員變數 預設初始化: 數字: 0 0.0 char : u0000 boolean : false 引用: null 修飾符 屬性型別 屬性名 = 屬性值!

  5. 物件的建立和使用 -必須使用new 關鍵字創造物件,構造器 Person mamba = new Person(); -物件的屬性 mamba.name -物件的方法 mamba.sleep()

  6. 類: 靜態的屬性 屬性 動態的行為 方法

    三大特性

    ~封裝、繼承、多型~

封裝

  • 該露的露,該藏的藏

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

  • 封裝(資料的隱藏)

    • 通常,應禁止直接訪問一個物件中資料的實際表示,而應通過操作介面來訪問,這稱為資訊隱藏。

  • 記住這句話就夠了:屬性私有, get/set

繼承

  • 繼承的本質是對某一批類的抽象, 從而實現對現實世界更好的建模。

  • extends的意思是"擴充套件”。子類是父類的擴充套件。

  • JAVA中類只有單繼承,沒有多繼承!

  • 繼承是類和類之間的一種關係。除此之外,類和類之間的關係還有依賴、組合、聚合等。

  • 繼承關係的倆個類, 一個為子類(派生類),一個為父類(基類)。子類繼承父類,使用關鍵字extends來表示。

  • 子類和父類之間,從意義.上講應該具有"is a"的關係.

  • object類

  • super

  • 方法重寫

super注意點: 1.super呼叫父類的構造方 2.super必須只能出現在子類的方法或者的構造方法中! 3.super和this不能同時呼叫構造方法

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

重寫:需要有繼承關係,子類重寫父類的方法
  1. 方法名必須相同
  2. 引數列表必須相同
  3. 修飾符:範圍可以擴大但不能縮小: public> Protected >Default >private
  4. 丟擲的異常:範圍可以被縮小,但不能擴大: ClassNotFoundException--> Exception
重寫,子類的方法和父類的方法必須一致;方法體不同

為什麼需要重寫:
  父類的功能,子類不一定需要,或者不一定滿足
  Alt+Insert: Override

多型

  • 動態編譯:型別:可擴充套件性

  • 即同一方法可以根據傳送物件的不同而採用多種不同的行為方式。

  • 一個物件的實際型別是確定的,但可以指向物件的引用的型別有很多(父類,有關係的類)

  • 多型存在的條件

    • 有繼承關係

    • 子類重寫父類方法

    • 父類引用指向子類物件

  • 注意:多型是方法的多型,屬性沒有多型性。

  • instanceof (型別轉換) 引用型別,判斷一個物件是什麼型別

/*
多型注意事項:
1. 多型是方法的多型,屬性沒有多型
2. 父類和子類 有聯絡   型別轉換異常 ClassCastException
3. 存在的條件:繼承關係,方法需要重寫,父類的引用指向子類
                                  Father f1 = new Son();
不能被重寫的方法
  1. static方法,屬於類,不屬於例項;
  2. final 常量;
  3. private方法;
*/
/*
1. 父類引用指向子類的物件
2. 把子類轉換為父類,向上轉型
3. 把父類轉換為子類,向下轉型:強制轉換
4. 方便方法的呼叫,減少重複的程式碼

*/
public class Person {
  //2. 賦初始值
  {
      System.out.println("匿名程式碼塊");
  }
  //1. 只執行一次
  static {
      System.out.println("靜態程式碼塊");
  }
  //3.
  public Person() {
      System.out.println("構造方法");
  }

  public static void main(String[] args) {
      Person person = new Person();
      System.out.println("==================");
      Person person1 = new Person();

  }
}
輸出:{
靜態程式碼塊
匿名程式碼塊
構造方法
==================
匿名程式碼塊
構造方法
}

被final修飾的類無法被繼承

package com.oop.Demo09;
//靜態匯入包
import static java.lang.Math.random;
import static java.lang.Math.PI;

public class Test {
  public static void main(String[] args) {
      System.out.println(Math.random());
      System.out.println(random());
      System.out.println(PI);
  }
}

抽象類

  • abstract修飾符可以用來修飾方法也可以修飾類,如果修飾方法,那麼該方法就是抽象方法;如果修飾類,那麼該類就是抽象類。

  • 抽象類中可以沒有抽象方法,但是有抽象方法的類一定要宣告為抽象類。

  • 抽象類,不能使用new關鍵字來建立物件,它是用來讓子類繼承的。

  • 抽象方法,只有方法的宣告,沒有方法的實現,它是用來讓子類實現的。

  • 子類繼承抽象類,那麼就必須要實現抽象類沒有實現的抽象方法,否則該子類也要宣告為抽象類。

    抽象類中的所有方法,繼承了他的子類,都必須實現他的方法,除非他的子類也是抽象類,則由子類的子類來實現

介面

  • 普通類:只有具體實現

  • 抽象類:具體實現和規範(抽象方法)都有!

  • 介面:只有規範! 專業的約束,約束和實現分離:面向介面程式設計

  • 介面就是規範,定義的是一組規則,體現了現實世界中"如果你...則必須能..的思想。如果你是天使,則必須能飛。如果你是汽車,則必須能跑。如果你好人,則必須幹掉壞人;如果你是壞人,則必須欺負好人。

  • 介面的本質是契約,就像我們人間的法律一樣。制定好後大家都遵守。

  • 00的精髓,是對物件的抽象,最能體現這一點的就是介面。為什麼我們討論設計模式都只針對具備了抽象能力的語言(比如c++、 java、 c#等) ,就是因為設計模式所研究的,實際上就是如何合理的去抽象。

宣告類的關鍵字是class,宣告接F的關鍵字是interface

介面的作用 1. 約束 2. 定義一些方法,讓不同的人實現 3. public abstract 4. public static final 5. 介面不能被例項化,介面中沒有構造方法 6. implements可以實現多個介面 7. 必須重寫介面中的方法

內部類

  • 內部類就是在一個類的內部在定義一個類,比如,A類中定義一個B類,那麼B類相對A類來說就稱為內部類,而A類相對B類來說就是外部類了。

    1. 成員內部類

    2. 靜態內部類

    3. 區域性內部類

    4. 匿名內部類