類和物件的概念
類的定義
類是一種使用者自定義的資料型別,它是建立物件的藍圖,定義了一組屬性(稱為“欄位”)和方法(稱為“函式”)。類是物件導向程式設計的基本構建塊,它封裝了資料和行為。
物件的建立
物件是類的例項,它是類的具體化。物件具有類定義的屬性(欄位)和方法(函式),並且可以訪問和修改這些屬性。透過“new”關鍵字建立物件。
成員變數(屬性)
成員變數是類的屬性,它們可以是靜態變數(靜態成員變數)或非靜態變數(非靜態成員變數)。
/*類的定義和物件的建立*/
// 類的定義
public class MyClass {
// 成員變數
private int myVar;
// 構造器(無參)
public MyClass() {
this.myVar = 0;
}
// 構造器(有參)
public MyClass(int var) {
this.myVar = var;
}
// 成員方法
public int getMyVar() {
return myVar;
}
public void setMyVar(int var) {
this.myVar = var;
}
}
// 物件的建立(無參)
MyClass obj1 = new MyClass();
// 物件的建立(有參)
MyClass obj2 = new MyClass(10);
-
靜態變數:靜態變數屬於類,而不是特定的物件。它們在類載入時建立,而不是在建立物件時建立。靜態變數可以使用類名直接訪問。
-
非靜態變數:非靜態變數屬於類的例項,而不是類。它們在建立物件時建立,而不是在類載入時建立。要訪問非靜態變數,需要建立類的例項並使用例項名訪問。
// 類的定義 public class MyClass { // 靜態變數 private static int staticVar; // 非靜態變數 private int nonStaticVar; // 構造器 public MyClass(int var) { this.nonStaticVar = var; } // 靜態方法(獲取靜態變數) public static int getStaticVar() { return staticVar; } // 靜態方法(設定靜態變數) public static void setStaticVar(int var) { staticVar = var; } // 非靜態方法(獲取非靜態變數) public int getNonStaticVar() { return nonStaticVar; } // 非靜態方法(設定非靜態變數) public void setNonStaticVar(int var) { this.nonStaticVar = var; } } // 訪問靜態變數 int staticVarValue = MyClass.getStaticVar(); // 訪問非靜態變數 MyClass obj = new MyClass(10); int nonStaticVarValue = obj.getNonStaticVar();
成員方法(函式、方法)
成員方法是類的函式,它們可以靜態方法(靜態成員方法)或非靜態方法(非靜態成員方法)。
-
靜態方法:靜態方法屬於類,而不是特定的物件。它們可以直接使用類名呼叫,而不需要建立類的例項。靜態方法通常用於操作靜態變數或執行與物件無關的操作。
-
非靜態方法:非靜態方法屬於類的例項,而不是類。要呼叫非靜態方法,需要建立類的例項並使用例項名呼叫。非靜態方法通常用於操作物件的屬性和執行與物件相關的操作。
// 類的定義 public class MyClass { // 靜態方法 public static void staticMethod() { System.out.println("This is a static method."); } // 非靜態方法 public void nonStaticMethod() { System.out.println("This is a non-static method."); } } // 呼叫靜態方法 MyClass.staticMethod(); // 建立物件 MyClass obj = new MyClass(); // 呼叫非靜態方法 obj.nonStaticMethod();
物件的例項化
構造器
構造器是一種特殊的方法,用於在建立物件時初始化物件。構造器的名稱與類名相同,沒有返回型別,並且通常包含對成員變數的初始化。
構造器的使用
使用“new”關鍵字建立物件,並在括號中傳遞引數(如果有)。例如:
MyClass obj = new MyClass(param1, param2);
構造器過載
構造器過載是指在同一個類中定義多個構造器,每個構造器具有不同的引數列表。這允許建立具有不同初始狀態的物件。
匿名物件
匿名物件是不具有名稱的物件,它們通常用於一次性使用。例如,當傳遞一個物件作為引數,但不需要該物件在其他地方使用時,可以使用匿名物件。例如:
someFunction(new MyClass(param1, param2));
// 類的定義
public class MyClass {
private int myVar;
public MyClass(int var) {
this.myVar = var;
}
public int getMyVar() {
return myVar;
}
}
// 使用匿名物件
MyClass obj = new MyClass(10);
int value = obj.getMyVar();
Java中物件的銷燬
在Java中,當一個物件不再被引用時,它將被垃圾回收器(GC)銷燬。垃圾回收器會自動檢測不再使用的物件,並釋放其記憶體。
總結
類是一種使用者自定義的資料型別,用於建立具有屬性和行為的物件。物件是類的例項,它們具有類定義的屬性和方法。成員變數是類的屬性,可以是靜態變數或非靜態變數。成員方法是類的函式,可以是靜態方法或非靜態方法。
物件透過構造器進行例項化,構造器用於初始化物件的屬性。可以對構造器進行過載以建立具有不同初始狀態的物件。在Java中,當一個物件不再被引用時,它將被垃圾回收器銷燬。
匿名物件是不具有名稱的物件,它們通常用於一次性使用。
類與類之間的關係(UML)
在統一建模語言(Unified Modeling Language,簡稱UML)中,類與類之間的關係是UML的核心概念之一,用於表示系統中不同元素之間的相互作用。以下是一些基本的類關係型別:
-
關聯(Association):表示兩個類之間的連線,通常用來描述物件之間的關係。關聯可以是單向的或雙向的,並且可以有多重性(例如,一個班級可以關聯多個學生,一個學生可以屬於一個班級)。
-
聚合(Aggregation):是一種特殊的關聯,表示整體與部分的關係,但部分可以獨立於整體存在。例如,一個公司可以聚合多個部門,但部門在沒有公司的情況下也可以存在。
-
組合(Composition):也是整體與部分的關係,但與聚合不同,部分不能獨立於整體存在。如果整體被銷燬,部分也會被銷燬。例如,一輛車由多個部件組成,如果車被銷燬,部件也會隨之銷燬。
-
繼承(Inheritance):表示一個類(子類)可以繼承另一個類(父類)的屬性和行為。子類是父類的一個特化,可以新增自己的屬性和行為。
-
實現(Realization):表示一個類實現了一個介面。介面定義了一組操作,而實現類提供了這些操作的具體實現。
-
依賴(Dependency):表示一個類(依賴類)在某種程度上依賴於另一個類(被依賴類)。這種關係通常是暫時的或條件性的,例如,一個類的方法可能需要另一個類的物件作為引數。
-
//泛化(Generalization):是繼承的另一種表述方式,表示子類是父類的一個特例。
-
//友元(Friend):在某些程式語言中,一個類可以宣告另一個類為其友元,這樣友元類就可以訪問它的私有成員。
-
//多重繼承(Multiple Inheritance):某些語言允許一個類繼承多個父類,這在UML中也可以表示,但要注意,這可能導致複雜的繼承關係和問題。
這些關係在UML類圖中用不同的圖形符號表示,以便於視覺化和理解類之間的關係。