在 C 程式語言裡,union 是一種特殊的資料型態,它允許在同一個記憶體位置上儲存不同類型的資料。這意味著,union 中的所有成員共用同一個記憶體區塊,因此一次只能儲存一個成員的值。
Union Type 的範例(C 語言)
以下是一個 C 語言中使用 union 的範例:
c
複製程式碼
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 220.5;
printf("data.f: %f\n", data.f);
// 儲存字符串會覆蓋之前儲存的值
strcpy(data.str, "Hello, World!");
printf("data.str: %s\n", data.str);
return 0;
}
在這個範例中,union Data 可以儲存一個 int、一個 float 或一個 char 字符串,但這三者不能同時存在。最後一個被賦值的成員會覆蓋前面的成員。
在 Java 中模擬 Union Type
Java 中沒有直接的 union 型態,但我們可以使用類別(class)和多態(polymorphism)來達成類似的效果。我們可以定義一個基類,並且讓不同類型的資料繼承這個基類,這樣就可以在同一個引用(reference)變數中儲存不同類型的資料。
Java 範例
以下是用 Java 模擬 C 語言中的 union 功能的範例:
java
複製程式碼
// 定義一個基類 Data
abstract class Data {
abstract void print();
}
// 定義三個不同的子類來代表不同的數據類型
class IntData extends Data {
int i;
IntData(int i) {
this.i = i;
}
void print() {
System.out.println("data.i: " + i);
}
}
class FloatData extends Data {
float f;
FloatData(float f) {
this.f = f;
}
void print() {
System.out.println("data.f: " + f);
}
}
class StringData extends Data {
String str;
StringData(String str) {
this.str = str;
}
void print() {
System.out.println("data.str: " + str);
}
}
// 主程式
public class Main {
public static void main(String[] args) {
Data data;
data = new IntData(10);
data.print();
data = new FloatData(220.5f);
data.print();
data = new StringData("Hello, World!");
data.print();
}
}
在這個 Java 範例中,我們定義了一個抽象基類 Data,並且為每一種資料類型(int、float、String)分別定義了一個子類。每個子類實現了 print 方法來印出其包含的數據。這樣,我們可以在同一個 Data 變數中儲存不同類型的數據,達到類似 union 的效果。
這樣做的好處是可以利用物件導向的特性,讓程式碼更具結構性和可讀性,並且避免了使用 union 所可能引發的記憶體管理問題。