
上QQ阅读APP看书,第一时间看更新
3.1 通过引用操作对象
“名字有什么意义呢?就算用别的名字称呼玫瑰,也丝毫不减她的芬芳。”
—威廉•莎士比亚,《罗密欧与朱丽叶》
所有编程语言都在内存中处理各种元素。有时候程序员必须小心处理这种内存操作。比如,你是直接操作这些元素,还是通过某些特殊方式(比如C和C++中的指针)间接进行操作?
通过使用统一的语法,Java将一切都视为对象,从而简化了这种问题。虽然说的是“将一切都视为对象”,但你实际操作的其实是该对象的引用(reference)[1]。举个例子,假设有一台电视机(对象)和一个遥控器(引用),只要你掌握了遥控器这个引用,就能控制电视机这个对象。当你想要“换频道”或者“降低音量”时,你实际操作的是引用,再由引用来修改对象信息。所以,当你在房间里走来走去时,只要带着遥控器(即引用)就依然可以遥控电视机。
同样,遥控器也可以不依赖于电视机而独立存在。也就是说,引用未必会关联某个对象。比如若想保存一个词或一个句子,你就需要创建一个String类型的引用,如下所示:

不过,这样你只是创建了一个引用而非对象。如果现在你向对象s发送信息,则会得到一条报错消息,因为s还没有连接到任何对象(也就是还没有电视机呢)。所以一种安全的做法是,始终在创建引用时就进行初始化,比如:

上面的代码使用了Java的一个特性,即字符串(String)可以用带引号的文本进行初始化。而对于其他类型的对象而言,你需要使用一种更为通用的初始化方式。