#4 – 什麼是「具體的記憶體物件」?

「具體的記憶體物件」在程式開發中,指的是程式運行時根據類別(Class)的定義,在電腦的記憶體(RAM)中分配的一段空間,用來存放該類別的數據(屬性)和行為(方法)的具體實例。


什麼是記憶體物件?

在程式執行的過程中,電腦的記憶體是動態使用的,會根據程式的需求分配記憶體給各種變數、資料結構和物件。物件是程式中非常重要的結構,以下是它的特點:

  1. 在記憶體中有實際的地址
    當一個物件被建立後,它會佔用記憶體的一部分,這段記憶體的地址由系統分配,程式可以透過變數引用這段地址來操作物件。
  2. 包含屬性和方法
    物件會包含所有屬性(fields/properties)的實際數值,並允許執行其方法(methods)。這是根據類別的定義生成的,但在記憶體中每個物件的屬性值可能不同。

以 C# 為例說明具體記憶體物件

1. 類別的定義是抽象的

一個類別本身是一個設計圖,並不會直接佔用記憶體。例如:

   public class Dog
   {
       public string Name { get; set; }
       public int Age { get; set; }
       public void Bark()
       {
           Console.WriteLine("Woof!");
       }
   }
  • 這段程式碼描述了一個 Dog 類別,定義了名字(Name)、年齡(Age)和一個行為(Bark)。
  • 但直到實例化之前,記憶體中還不存在任何 Dog 物件。

2. 實例化後,物件成為具體的存在

當我們使用 new 關鍵字時,會在記憶體中生成具體的 Dog 物件:

   Dog myDog = new Dog();
   myDog.Name = "Buddy";
   myDog.Age = 3;
   myDog.Bark();
  • new Dog() 創建了一個「具體的記憶體物件」,以下是過程:
    • 系統分配一段記憶體空間,專門存放 myDog 的數據(例如 NameAge)。
    • 這段記憶體和 Dog 類別的定義對應。
    • myDog 是物件的引用,指向這段記憶體。
    結果:
  • myDogNameBuddyAge3,這些值存放在具體的記憶體位置中。
  • 每一個 Dog 物件(例如再創建 Dog anotherDog = new Dog();)都會有自己獨立的記憶體位置和數據。

具體的記憶體物件與資料庫連線的關係

DatabaseConnection 類別為例:

  1. 類別是抽象定義
   public class DatabaseConnection
   {
       public string ConnectionString { get; set; }
       public void Open()
       {
           Console.WriteLine("Connecting to database...");
       }
   }
  • DatabaseConnection 定義了資料庫連線的結構,但在實例化之前,程式並未和資料庫產生實際互動。
  1. 實例化建立具體物件
   DatabaseConnection connection = new DatabaseConnection
   {
       ConnectionString = "Server=myServer;Database=myDB;User=myUser;Password=myPass;"
   };
   connection.Open();
  • 過程:
    • 系統在記憶體中分配一段空間,存放 connectionConnectionString 和其他狀態資料。
    • connection 物件透過 Open() 方法執行具體行為,像是建立與資料庫的 TCP/IP 連線。
  • 具體的記憶體物件:
    • 這段記憶體不僅存放屬性資料(ConnectionString),還負責追蹤連線的狀態,例如是否已開啟。

為什麼強調具體記憶體物件?

  1. 與靜態定義的差異
  • 類別定義僅描述行為與屬性,並不佔用動態記憶體。
  • 當實例化發生時,系統才在記憶體中分配空間,使這些屬性和行為成為可操作的實體。
  1. 每個物件是獨立的實體
  • 即使多次從相同的類別實例化,產生的每個物件在記憶體中是彼此獨立的。它們擁有不同的屬性值與狀態。
  1. 與執行結果的關聯性
  • 物件的行為和屬性在程式運行時產生作用。例如,資料庫連線需要依賴具體的實例,因為每次連線都有獨立的狀態和設定。

比喻理解

如果還是覺得程式中「實例化」的概念抽象,可以試著這樣理解:

  1. 類別 vs 記憶體物件
類別(Class)房子的藍圖描述了房子的結構,但不是真正的房子。
實例化(Instantiates)根據藍圖建造出真正的房子
記憶體中的物件(Memory Object)就是這座房子具體可以住人、擺家具
  1. DatabaseConnection 的具體化
  • 類別是「描述如何連線到資料庫」的藍圖。
  • 實例化後,程式在記憶體中創建了這個連線的具體表示,並進一步與資料庫實際互動。

結論

「具體的記憶體物件」描述的是程式運行時在記憶體中生成的一個真實存在的實例,它不僅有資料(屬性),還可以執行行為(方法)。這與類別定義的「抽象設計圖」形成對比,是物件導向程式設計中的核心概念。


「那一枚石頭,
沉睡在時間的河床,
你撿起,握緊,
它是記憶的形狀,
一切具體的物,
都擁抱了遺忘的重量。」

——楊牧,《物之記憶》