注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[java] Objects and Equality  

2009-05-24 23:35:05|  分类: lang_java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
源于《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() 是件麻烦的事情,得小心点。
  评论这张
 
阅读(548)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017