7.2 对象引用模型
在某些 OOP 语言(如 C++)中,声明一个类类型的变量就会创建该类的一个实例(与 Object Pascal 中的记录差不多)。本地对象的内存来自堆栈,并在函数结束时释放。不过,在大多数情况下,你必须明确地使用指针和引用,才能更灵活地管理对象的生命周期,这就增加了很多额外的复杂性。
Object Pascal 语言则基于对象引用模型,与 Java 或 C# 完全相同。其原理是,类类型的每个变量并不保存对象的实际值及其数据(例如,存储日、月和年)。相反,它只包含一个引用或指针,用来指示存储实际对象数据的内存位置。
注解: 在我看来,采用对象引用模型是编译器团队在语言早期做出的最佳设计决策之一,当时这种模型在编程语言中并不常见(事实上,那时还没有Java,也没有C#)。
因此,在这些语言中,您需要显式创建一个对象并将其赋值给变量,因为对象不会自动初始化。换句话说,当你声明一个变量时,你并没有在内存中创建一个对象,你只是为对象的引用保留了内存位置。对象实例必须手动和显式地创建,至少对于你定义的类的对象是这样。(不过,在 Object Pascal 中,运行库会自动创建放置在窗体上的组件实例)。
在 Object Pascal 中,要创建对象的实例,我们可以调用其特殊的 Create 方法,即类本身定义的构造函数或其他自定义构造函数。以下是代码:
ADay := TDate.Create;
正如你所看到的,构造函数应用于类(类型),而不是对象(变量)。这是因为你要求类创建一个其类型的新实例,而结果是一个你通常会赋值给变量的新对象。
Create
方法从何而来呢?它是 TObject 类的构造函数,所有其他类都继承自该构造函数(下一章将讨论该主题)。不过,在类中添加自定义构造函数是很常见的,我们将在本章后面的章节中看到。