各种OO语言中采用不同方式实例化(创建)对象。在C#中,当声明一个用户自定义类型变量,如:
Student y;
的时候,并没有在内存中真的创建对象,而只是声明了Studnet类型的引用变量y。该引用变量可能会指向一个Student对象,但目前还没有;或者说,它的值为null,null是C#关键字,用来表示不存在的对象。
必须通过特别的C#操作符——new ——来真正在内存中创造一个全新的Student对象,和把新对象与引用变量y关联起来,如下所示:
y = new Student();
在幕后,我们实际上把对象被创建到的物理内存地址与变量y关联起来。
把新创建的对象看作是一个氢气球,而引用变量则是抓住气球系绳的手,这样就可以在任何时候访问对象。
引用变量有时被非正式地看作“抓住了”对象,所以我们常使用非正式术语句柄(handle)作类似这样的表达:“引用变量y维护一个Student对象的句柄”。
也可以创建新对象,而不把它立即指定一个引用变量,如下面的代码:
new Student();
但这样的对象如同没有系绳的氢气球:它可能真的存在,但却无法在程序中访问。它将在内存中飘离我们的掌握。
注意,可以把声明引用的变量和真正实例化变量指向的对象这两步合到一起,用一行代码表示:
Student y = new Studnet();
另一种初始化应用变量的方法是交给它一个已存在的对象:已经为另一个不同的引用变量(“手”)引用(“抓住”)的对象(“氢气球”)。来看一个例子。
//声明引用变量,实例化第一个Student对象
Student x = new Student();
//声明第二个引用变量,但不实例化第二个Studnet对象。
Student y;
//向y传递一个“句柄”,该句柄属于y掌握的对象所有
//(x继续掌握它)。现在,我们拥有系着同一个气球的两条绳
y =x;