譬如,我们已声明了一个名叫Balloon的类。可以用下式来生成Balloon对象(这是Java或C++书里的惯用语。所谓Balloon对象,说得明白一点,就是以类Balloon为模板生成的对象。):
Balloon rope1 = new Balloon();
对这个语句,几乎所有的BBS里都有人问过:这个类名Balloon,为啥要出现两次?我也一直纳闷。后来觉得似乎有点懂了,写出来让大家批评。
其实,这条语句是个三步曲,就是包含着三个动作:创建一个Balloon对象;创建一个Balloon引用(所谓Balloon引用,是指能指向Balloon对象的引用。);使新创建的Balloon引用指向新创建的Balloon对象。
我们把它们分解开来看看。第1句:
Balloon rope1;
只创建一个Balloon引用。它没指向任何一个对象。第2句:
new Balloon();
创建了一个Balloon对象。但是,并没有将它和任何引用相关联。好比做了一个气球,但是没用绳子把它系住,它飞了。这个对象没法使用,成了内存里的垃圾,将由Java的垃圾收集机制来回收。
因此,三步曲里第2、3两步没法分割开,只能合在一起:
rope1 = new Balloon();
现在,我们对语句
Balloon rope1 = new Balloon();
里为何使用两个Balloon的问题,应该弄清楚了。左边的类名Balloon用来创建Balloon引用,右边的类名Balloon用来创建Balloon对象。两个各司其职,没有一个是多余的。
我把例子中的类命名为Balloon(气球),把对象引用命名为rope(绳子),暗喻了对象与引用之间的关系。
我们没有看到对象的名字(很多人把引用rope当作了对象),那是为什么呢?我以为,对象是采用动态分配(又叫堆分配)的方式在堆空间里创建的。对于在堆空间里的任何实体,尽管它们也是实实在在存在的,但是我们的代码对它们是看不见、摸不着。没法取名,取了名也没用。对象只能通过引用来访问。
可以有闲着的引用(没系上任何一个气球的绳子),不能有闲着的对象(没有一条绳子系住它)。没有任何一个引用指向的对象,就成了内存中的垃圾,将由Java的垃圾收集(Garbage Collection)机制回收。确切地说,一个对象,至少有一个引用指向它,也允许有多个引用同时指向它;一个引用,可以不指向对象,也可以指向一个(只能是一个)对象。
这些不光是在Java中,估计其它面向对象语言也差不多吧?