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

原创 2006年06月19日 12:57:00

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

使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

hashcode()和equals()都继承于object,在Object类中的定义为: equals()方法在Object类中的定义: public boolean equals...
  • tuolaji8
  • tuolaji8
  • 2015年09月13日 17:34
  • 3259

【OC复合题】之定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)

题目: 定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C) 1)    不使用@property,手动编写他们的访问器方法(getter和...
  • u011349387
  • u011349387
  • 2015年05月26日 15:20
  • 3428

实现多线程有两种方法: Thread类继承和Runnable接口实现

l 创建线程的第一种方式:继承Thread类。 步骤: 1,定义类继承Thread。 2,复写Thread类中的run方法。 目的:将自定义代码存储在run方法。让线程运行。/...
  • u013380777
  • u013380777
  • 2016年07月04日 11:41
  • 4789

【Java】【反射技术】2个对象除了类名不一样,类的定义部分完全一样;当给定一个对象,转换成另一个类的对象。

1. API实现代码 toAnotherObj() 方法实现 package devin.wu.training.reflect.convertor; import java.lang.refl...
  • WolfOfSiberian
  • WolfOfSiberian
  • 2016年11月16日 22:22
  • 2552

new对象时,类名后加括号与不加括号的区别

【1】默认构造函数   关于默认构造函数,请参见随笔《类中函数》   请看测试代码: 1 #include 2 using namespace std; 3 4 //...
  • qq_33485434
  • qq_33485434
  • 2017年11月03日 08:15
  • 64

通过类名获取类的实例对象

  • 2011年10月12日 20:05
  • 339KB
  • 下载

MFC中自定义窗口类名技巧

  • 2013年03月31日 11:49
  • 31KB
  • 下载

JAVA面向对象特点之封装 成员变量 局部变量 匿名对象 与 全限定类名

面向对象特点 1.封装 2.继承 3.多态 没有封装举例: 迅雷 核心功能 下载 50个程序员 50亲戚 比如有下载类 下载速度 ---- 20M/s ---- 200kb/...
  • liurongsheng123
  • liurongsheng123
  • 2018年01月08日 20:27
  • 126

类名.class Class.forName("类的全路径") 对象实例.getClass的区别

Class.forName("类的全路径"),getClass,.class加载类的区别
  • xiongmaodeguju
  • xiongmaodeguju
  • 2017年04月27日 15:00
  • 1288

Swift通过类名动态创建对象的方式

原文出处:Swift通过类名动态创建对象的方式前言最近一些朋友问到我在Swift中如何通过类字符串名称的方式创建类实例的问题,起初以为与Objective-C的差不多吧,事实上还是有很大的差别的。下面...
  • woaifen3344
  • woaifen3344
  • 2015年10月16日 16:00
  • 9409
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:定义对象时为何要出现两次类名?
举报原因:
原因补充:

(最多只允许输入30个字)