关闭

定义对象时为何要出现两次类名?

标签: javabbsc++语言
2397人阅读 评论(2) 收藏 举报

譬如,我们已声明了一个名叫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中,估计其它面向对象语言也差不多吧?

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31076次
    • 积分:437
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:41条
    文章存档
    最新评论