[java] Objects and Equality
2009-05-24 23:35:05| 分类:
lang_java
| 标签:
|举报
|字号大中小 订阅
源于《Practical Java》的实践8~15
java 在追寻平台无关的唯美性,同时又必须遵循目前计算机体系的现有结构。primitive types 和 reference types 就是折衷的产物。
java 中,除了 primitive types,比如 boolean, char, ... 等等,其他的 class ,对于局部变量,一定都是 reference types,说白了,就是只能拿到起指针,不能把 class instance 放在 stack(栈) 上。
有了 primitive,又不能很好的使用 java 自带的容器类(Array、Map啥的),所以还要给每个 primitive type 弄个对应的 wrapper class, 比如 Boolean, Character, ...。如此这般,所以对比两个值是否相等(equal),在 java 里面就带来问题了。
如下代码,对于只学 java 的人来说,匪夷所思。但学习 C/C++ 的同学就觉得十分正常。
int a = 10;
int b = 10;
if (a == b) { ... } // equal
Integer ia = new Integer(10);
Integer ib = new Integer(10);
if (ia == ib) { ... } // not equal
对于自己定义的 class,默认的 equals() 函数用的是 java.lang.Object 的 equals(),实现如下:
public boolean equals(Object obj)
{
return (this == obj);
}
可以发现,如果不自己定义 class equals(),基本不可能哈。
标准的 equals() 写法:
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj != null &&
getClass() == obj.getClass() &&
super.equals(obj)) // 如果是子类,可能需要此
{
... // wanna return true
}
return false;
}
其中 getClass() 可以判断两个 instance 是否为同一个 class 所实例化的(基类与子类就非同一个 class)。这就与“在 C++ 中写出完美的拷贝构造、赋值重载”一样,令人不爽。不过,你还得这么做。
反正,写 equals() 是件麻烦的事情,得小心点。
评论这张
转发至微博
转发至微博
评论