類與物件的概念

nadooo發表於2024-08-01

類與物件的概念

一.類(class)

類(Class)是物件導向程式設計(OOP, Object-Oriented Programming)中的一個核心概念。它是一種將資料(稱為屬性或欄位)和操作這些資料的方法(稱為函式或方法)封裝在一起的邏輯單元。類是建立物件的藍圖或模板,它定義了物件可以擁有的屬性和方法。

在物件導向程式設計中,類是一種抽象的資料型別,用於描述具有共同特徵(屬性)和行為(方法)的物件的集合。透過類,我們可以定義一種新型別的資料,並可以建立該型別的一個或多個例項(即物件)

類的主要組成部分:
  1. 屬性(Attributes):也稱作欄位(Fields),用於定義物件的狀態或資料。它們可以是基本資料型別(如整數、浮點數、字元等)或其他物件型別。
  2. 方法(Methods):定義物件可以執行的操作或功能。方法是與類相關聯的函式,它們可以訪問和操作類的屬性以及呼叫其他方法。
  3. 構造方法(Constructor):一種特殊的方法,用於在建立物件時初始化物件的屬性。在大多數物件導向程式語言中,構造方法的名字與類名相同,且通常沒有返回值。
類的特性:
  • 封裝(Encapsulation):將資料(屬性)和作用於資料的操作(方法)封裝在一起,形成一個獨立的單元。這有助於隱藏物件的內部實現細節,只對外暴露必要的介面。
  • 繼承(Inheritance):允許建立一個新的類(稱為子類或派生類),它繼承了一個或多個現有類(稱為基類、父類或超類)的屬性和方法。這促進了程式碼的複用和擴充套件。
  • 多型(Polymorphism):允許不同類的物件對同一訊息做出響應,但具體實現可以不同。這增強了程式的靈活性和可擴充套件性。

二.物件

物件(Object)是物件導向程式設計(OOP, Object-Oriented Programming)中的基本單元,它是類的例項。簡單來說,物件是一個具體存在的實體,它擁有狀態(屬性)和行為(方法)。在物件導向程式設計中,我們透過定義類來建立具有特定屬性和方法的物件。

物件的狀態是透過其屬性來描述的,這些屬性可以是基本資料型別(如整數、浮點數、字串等)或其他物件型別。物件的行為是透過其方法來實現的,方法定義了物件能夠執行的操作或功能。

物件具有以下幾個關鍵特性:

  1. 封裝:物件將其資料和運算元據的函式封裝在一起,形成一個獨立的單元。這有助於隱藏物件的內部實現細節,只對外暴露必要的介面。封裝還促進了資料的保護,使得外部程式碼不能直接訪問物件的內部資料,只能透過物件提供的方法來訪問和修改資料。
  2. 繼承:物件可以繼承另一個物件的屬性和方法。在物件導向程式設計中,這通常是透過類之間的繼承關係來實現的。子類(派生類)可以繼承父類(基類)的屬性和方法,並可以新增或覆蓋自己的屬性和方法。繼承有助於程式碼的複用和擴充套件。
  3. 多型:不同的物件可以對同一訊息(即方法呼叫)做出不同的響應。這意味著,即使多個物件屬於同一個類或其子類,並且它們都定義了相同的方法,但這些方法的具體實現可以不同。多型增強了程式的靈活性和可擴充套件性。

物件之間的互動是透過傳送訊息來實現的。在物件導向程式設計中,訊息通常是一個方法呼叫,它指定了接收訊息的物件(即方法呼叫的目標)以及要執行的操作(即方法名)。接收訊息的物件會根據自己的內部狀態和方法實現來響應這個訊息。

三.成員變數(Member Variables)

成員變數(Member Variables)或屬性(Attributes)是物件導向程式設計(OOP)中類的組成部分之一。它們用於定義類的狀態或資料,是類例項(即物件)的特徵或特性的表示。成員變數可以是任何有效的資料型別,包括基本資料型別(如整數、浮點數、字元等)和其他物件型別。

在類中,成員變數是定義在類的方法之外的變數。它們被類的所有例項共享(如果它們是靜態的,即使用static關鍵字宣告的),或者每個例項都有自己獨立的副本(如果它們是例項變數)。

1.例項變數

例項變數是類的每個例項(物件)都擁有的獨立變數。每個物件都有自己的一組例項變數副本,這些變數的值可以在物件之間獨立變化。例項變數在類的方法內部透過self(在Python中)或this(在Java、C++等語言中)關鍵字來訪問。

2.類變數(靜態變數)

類變數是由類本身擁有的變數,而不是由類的任何特定例項擁有的。這意味著類變數只有一個副本,並且這個副本被類的所有例項共享。類變數在類的方法內部可以直接透過類名來訪問(但通常也建議透過例項來訪問,除非有特別的理由)。在Python中,類變數通常定義在類的方法之外,但在類定義之內,並且不使用selfcls(對於類方法)作為字首。

訪問和修改成員變數
  • 訪問:在類的方法內部,可以透過self(或this)關鍵字來訪問例項變數,或者透過類名來訪問類變數(儘管這通常不推薦,因為它可能破壞封裝性)。在類的外部,通常需要透過物件來訪問例項變數,儘管在某些情況下(如使用getter和setter方法),可能會透過類的方法來間接訪問和修改這些變數。
  • 修改:成員變數的值可以在類的方法內部或外部被修改,但通常建議透過類的方法來修改它們,以保持封裝性並控制對資料的訪問。

四.成員方法(Member Method)

成員方法(Member Method),也稱為例項方法(Instance Method),是定義在類中的操作或行為。它們用於訪問和操作物件的屬性,並執行特定的任務。以下是關於成員方法的詳細解析:

1.定義與結構

成員方法是一個包含一條或多條語句的程式碼塊,用來完成一個具體的、相對獨立的功能。其定義通常包括以下幾部分:

  • 訪問修飾符:如public、private、protected等,用於控制方法的訪問範圍。
  • 返回型別:方法執行完畢後返回的資料型別,可以是Java中的任何資料型別,包括基本資料型別和引用資料型別。如果方法不返回任何值,則使用void關鍵字。
  • 方法名:遵循駝峰命名法,通常使用動詞來描述方法的功能。
  • 形參列表:方法接收的引數列表,用於傳遞資料給方法內部使用。引數可以為任意型別,包括基本型別和引用型別。
  • 方法體:包含實現方法功能的具體語句,如輸入、輸出、變數宣告、運算、分支、迴圈等。

2.呼叫機制

當程式執行到方法呼叫語句時,會開闢一個獨立的空間(棧空間)來執行該方法。方法執行完畢後,或者執行到return語句時,會返回到呼叫方法的地方,並繼續執行後續的程式碼。

3.特點與優勢

封裝性:成員方法可以將實現的細節封裝起來,只對外提供必要的介面,提高了程式碼的安全性和可維護性。
複用性:定義在類中的成員方法可以被該類的所有物件共享和呼叫,提高了程式碼的複用性。
擴充套件性:透過繼承和多型等機制,可以在子類中重寫父類的成員方法,實現功能的擴充套件和定製。

4.靜態方法與例項方法的區別

  • 靜態方法(也稱為類方法):使用static修飾符宣告的方法。它屬於類本身,而不是類的某個物件。因此,靜態方法可以透過類名直接呼叫,而無需建立類的例項。靜態方法內部不能訪問類的非靜態成員(變數和方法)。
  • 例項方法(也稱為非靜態方法):沒有使用static修飾符宣告的方法。它屬於類的某個物件,必須透過物件例項來呼叫。例項方法可以訪問類的所有成員(包括靜態成員和非靜態成員)。

五.物件的例項化(Object Instantiation)

物件的例項化(Object Instantiation)是物件導向程式設計中的一個核心概念,它指的是根據類的定義建立出具體的物件的過程。在例項化過程中,系統會為物件分配記憶體空間,並根據類的藍圖(即類的定義)來初始化物件的屬性和方法。例項化後的物件成為類的例項,可以訪問類中定義的屬性和方法。

例項化過程
1).定義類:首先,需要定義一個類,它包含了描述物件所需的所有屬性和方法。
2).建立物件:使用關鍵字(如Java中的new)來建立類的例項,即物件。這一步會觸發構造方法(Constructor)的執行,構造方法是一種特殊的方法,用於初始化新建立的物件。
3).分配記憶體:系統在堆記憶體中為物件分配足夠的空間,用於儲存物件的屬性(包括例項變數)和方法(雖然方法本身不儲存在物件中,但物件會持有對類方法的引用)。
4).初始化:構造方法執行,對物件的屬性進行初始化。如果類中沒有顯式定義構造方法,則編譯器會提供一個預設的構造方法。但一旦定義了至少一個構造方法,編譯器就不會再提供預設的構造方法。
5).返回物件引用new運算子的執行結果是一個指向新建立物件的引用,這個引用可以儲存在變數中,用於後續對物件的訪問和操作。

相關文章