文档章节

20160411--相等测试与继承

v
 viewsonic001
发布于 2016/04/11 15:28
字数 565
阅读 14
收藏 0

Object类中的equals方法用于检测两个对象是否相等,而相等判断的标准则是二者是否引用同一个对象。

  下面给出编写一个完美的equals方法的原则:

  1,将equals的Object类显式参数命名为otherObject。  

  2,检测otherObject是否与this引用自同一个对象。

  3,检测otherObject是否为null,是的话返回false。

  4,检测this与otherObject是否属于同一个类,这里需要注意的情况就是当比较的两个对象不属于同一个类时,比如 p.equals(e),p是一个Person,e是一个Employee,Employee继承自Person。Person拥有name,age私有 域,Employee具有occupation域。

  如果相等的概念是的对象的所有域都必须相等,p.equals(e)中使用e instalceof Person返回true,但是如果e.equals(p)调用,p instanceof Employee则返回false,不满足对称性要求,所以这里需要强制采用getClass()来进行类型检测。

  如果相等的概念是由超类决定的,比如认为只要name和age相同,则Person和Employee相等,则可以使用instance进行检测,同时在超类中将该方法定义为final。

  5,将otherObject转换为this类型的变量。

  6,现在开始进行私有数据域的比较,对于基本类型如数值,字符和布尔类型使用==进行比较,对对象域使用equals进行比较,所有域都相同则返回true。

  7,使用@Override声明有助于错误检查。

  示例如下:

public boolean equals(Object otherObject) {  
        if(this == otherObject) {    // 检测this与otherObject是否引用同一个对象  
            return true;  
        }  
  
        if(null == otherObject ) {   // 检测otherObject是否为空  
            return false;  
        }  
  
        if(!(getClass() == otherObject.getClass())){  // 比较this与oherObject是否属于同一个类,
        如果equal的语义在每个子类中有所改变,就用此判断  
            System.out.println("-----------------getClass----------------");  
            return false;  
        }  
  
        if( ! (otherObject instanceof Apple)) {  // 如果语义相同就用instanceof判断,判断继承时也用到  
            System.out.println("------------instanceof--------------------");  
            return false;  
        }  
  
        Apple other = (Apple) otherObject;  // 转换为相应类型,对所需域进行判断  
  
        return name.equals(other.name)&& color.equals(other.color);  
     }  
}


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        FreeTrial other = (FreeTrial) obj;
        if (strTel == null) {
            if (other.strTel != null)
                return false;
        } else if (!strTel.equals(other.strTel))
            return false;
        return true;
    }


本文转载自:http://www.cnblogs.com/yxl10/p/4161528.html

上一篇: bug
下一篇: HelloWorld
v
粉丝 0
博文 52
码字总数 9151
作品 0
杭州
程序员
私信 提问
C# - 为引用类型重定义相等性

通常情况下引用类型的相等性是不应该被重定义/重写的。 例如两个引用类型的变量 x 和 y,如果这样写:if(x == y) {...},那么大家都明白,这个比较的是引用的相等性。 但是有少数情况下,也可...

solenovex
04/20
0
0
mysql 新增字段时判断字段是否存在

1、问题引出 为了保证数据的正确性,代码的健壮性,我们必须对一些边界条件做一个判断,所以才会把修改表结构搞得如此复杂。 mysql 新增字段时判断字段是否存在,本来是一个很小的问题,因为...

learn_more
2016/04/01
1K
0
Effective Java 第三版——10. 重写equals方法时遵守通用约定

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104
2017/12/30
0
0
单元测试中Assert类的用法

首先说介绍一下,Assert类所在的命名空间为 Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可以使用了,...

xiao刀
2013/04/23
1K
0
Java核心技术第五章——2.Object类

Object类:所有类的超类 Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要这样写: public class Emloyee extends Object 如果没有明确的指出超类,Object就被...

Johnson木木
2018/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
38分钟前
6
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
39分钟前
9
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
48
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
7
0
go-micro 入门教程1.搭建 go-micro环境

微服务的本质是让专业的人做专业的事情,做出更好的东西。 golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单...

非正式解决方案
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部