Object类是Java中所有类的最终祖先,在Java中,每个类都是由它扩展而来的,但是并不需要这样写:
class Employee extends Object
如果没有明确地指出超类,Object就被认为是这个类的最终超类。可以使用Object类型的变量引用任何类型的对象:
Object obj = new Employee("Harry Hacker",35000);
当然,Object类型变量只能用于作为各种值的通用持有者。要想对它们进行特定的操作,还需要清楚对象的原始类型,并进行相应的类型转换:
Employee e = (Employee)obj;
在Java中,只有基本类型(primitive type,如数值、字符、和boolean)的值不是对象,而所有的数组类型,不管是对象数组还是基本类型的数组都扩展于Object类的类型。
5.2.1 equals方法
Object类中equals方法用于检测一个对象是否等于另外一个对象。如果两个对象具有相同的引用,它们一定是相等的。
Java语言规范要求equals方法具有下面的特性:
1)自反性:对于任何非空引用x,x.equals(x)应该返回true。
2)对称性:对于任何非空引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3)传递性:对于任何非空应用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4)一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5)对于任意非空引用x,x.equals(null)应该返回false。
下面给出编写一个完美的equals方法的建议:
1)显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。
2)检测this与otherObject是否引用同一个对象:
if(this == otherObject) return true;
3)检测otherObject是否为null,如果为null,返回false。
if(otherObject == null) return false;
比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测:
if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false;
4) 将otherObject转换为相应的类类型变量:
ClassName other = (ClassName)otherObject
5)现在开始对所有需要比较的域进行比较了。使用 == 比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true,否则返回false。
return field1==other.field1
&&field2.equals(other.field2)
&&...;
如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。
最后关于重写equals,还有一个最重要的说明:要重写HashCode。对于 eauals 与hashcode的宣言要必须一致。
摘自《Java核心技术》
分享到:
相关推荐
`Equals`方法是.NET类库中的一个基本成员,主要用于比较对象是否相等。在某些情况下,尤其是自定义控件或者业务实体类的设计中,我们可能需要重写`Equals`方法来实现特定的比较逻辑。下面我们将深入探讨WinForm中...
1. **`equals`方法和`hashCode`方法应保持一致性**:如果两个对象根据`equals`方法是相等的,那么它们的`hashCode`也应该是相等的。这是因为某些集合框架(如`HashMap`)会使用`hashCode`来定位元素,而使用`equals`...
Java中==符号与equals()的使用详解是Java程序中的一个重要概念,它们都是用来测试两个变量是否相等的,但是它们的使用方法和应用场景是不同的。下面我们将详细介绍Java中==符号与equals()的使用详解。 一、使用==...
Equals允许您在测试期间在python对象之间声明某些相等约束。 有时我们不想断言绝对相等,例如,我们需要确保两个列表具有相同的元素,但不关心顺序。 这是专门为和使用而设计的。 与Mock搭配使用: from mock ...
`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于生成对象的哈希值,这个值在哈希表中用来快速定位对象。 `equals()` 方法默认继承自 `Object` 类,它进行的是对象引用的比较,即如果两个对象...
在Java编程中,`Object#equals()`方法是用于比较两个对象是否相等的标准方式,但它的性能可能并不总是满足高效容器类中元素搜索的需求。这篇博客"代替Object#equals() - 加速在容器类中搜索元素速度的可能性"探讨了...
总之,测试Java中的字符串区域是否相等涉及到对字符串操作的理解和掌握,包括`substring()`、`equals()`、`compareTo()`、`regionMatches()`等方法的使用。通过熟练运用这些工具,开发者可以有效地解决各种字符串...
- 测试`equals()`和`hashCode()`的正确性,可以使用JUnit的EqualsTester类或自定义测试用例。 总之,`equals()`和`hashCode()`是Java中不可或缺的方法,它们对于对象的比较和哈希表操作起着核心作用。理解并正确...
要求覆盖基类Object中的ToString()方法和Equals()方法,使得直接输出Student对象时输出的是对象的id,name和age信息;并且当两个对象的学号相同时认为它们相等; 然后写一个主方法测试以上定义。
在Java中,`equals()`方法是Object类的一个成员方法,用于比较两个对象是否相等。默认情况下,它比较的是对象的引用,即判断两个对象是否指向内存中的同一位置。然而,通常我们需要比较对象的内容而不是引用,因此在...
对于基本类型,它直接比较它们的值是否相等。而对于对象,`==` 检查两个引用是否指向内存中的同一个实例。例如: ```java Integer num1 = new Integer(5); Integer num2 = new Integer(5); System.out.println(num1...
测试两个对象是否相等(浅)的简单函数。 安装 npm install object - equal 用法 var assert = require ( 'assert' ) ; var equals = require ( 'object-equal' ) ; assert ( equals ( { a : 1 , b : 'nada' } , {...
在某些特定场景下,我们可能需要比较两个Map对象是否相等,但标准的Map.equals()方法会比较整个Map,包括键和值的顺序以及它们的哈希值。然而,在某些情况下,我们可能只需要关心值的特定属性,比如当值是String类型...
"fs-equals"是一个专门为前端开发者设计的开源库,它专注于比较文件系统中的文件是否相等。这个库的目的是提供一个高效且可靠的机制来验证两个文件的内容是否完全一致,这对于版本控制、文件同步或一致性检查等场景...
这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。 equals 方法是用于比较两个对象是否相同的。它的默认实现是比较两个对象的引用是否相同,如果是同一个对象,那么 equals 方法将...
对于三角形面积计算,测试用例应涵盖合法边界(如相等的边长)、非法边界(如负数或大于100的边长)以及有效和无效的输入组合。 9. **等价类和边界值测试** - 等价类分为有效等价类(符合需求的输入)和无效等价类...
set方法用于设置日期,lastDay方法用于获取某个月的最后一天,nextDay方法用于获取下一天的日期,equals方法用于判断两个日期是否相等,toString方法用于将日期转换为字符串。 现在,让我们来看一下Junit测试的实现...
equals方法是Java中Object类的一个方法,用于比较两个对象的内存地址是否相等。其源码如下: public boolean equals(Object paramObject){ return(this == paramObject); } 从源码中可以看到,equals方法是用来...
- 对于 `Double` 类,由于浮点数的精度问题,`double1.equals(double2)` 检查的是它们的值是否足够接近,认为是相等的,而`double1 == double2` 依然比较引用。在这里,两个`Double`对象代表相同的数值,所以`double...
- **设计原理**:`equals()`方法比较对象的差异,并返回布尔值表示是否相等 4. **Internal Tester Class模式** - **测试对象**:JAVA包 - **针对问题**:测试包内多个类,保持测试代码与运行代码的分离 - **...