算法(4th ed)(75):基础——数据抽象 4.1.8

阅读数:11 2019 年 11 月 2 日 11:55

算法(4th ed)(75):基础——数据抽象 4.1.8

(使用抽象数据类型:赋值语句)

使用引用类型的赋值语句将会创建该引用的一个副本。赋值语句不会创建新的对象,而只是创建另一个指向某个已经存在的对象的引用。这种情况被称为别名:两个变量同时指向同一个对象。别名的效果可能会出乎你的意料,因为对于原始数据类型的变量,情况不同,你必须理解其中的差异。如果 xy 是原始数据类型的变量,那么赋值语句x = y 会将 y 的值复制到 x 中。对于引用类型,复制的是引用(而非实际的值)。在 Java 中,别名是 bug 的常见原因,如下例所示(图 1.2.4):

复制代码
Counter c1 = new Counter("ones");
c1.increment();
Counter c2 = c1;
c2.increment();
StdOut.println(c1);

算法(4th ed)(75):基础——数据抽象 4.1.8

图 1.2.4 别名

对于一般的 toString() 实现,这段代码将会打印出 "2 ones"。这可能并不是我们想要的,而且乍一看有些奇怪。这种问题经常出现在使用对象经验不足的人所编写的程序之中(可能就是你,所以请集中注意力!)。改变一个对象的状态将会影响到所有和该对象的别名有关的代码。我们习惯于认为两个不同的原始数据类型的变量是相互独立的,但这种感觉对于引用类型的变量并不适用。

评论

发布