`
tory320
  • 浏览: 34191 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java中的equals方法

    博客分类:
  • java
阅读更多
equals()方法在包含继承时,需要注意写问题。equals的约定声明:如果p和q不是null,
p.equals(q)也该和q.equals(p)返回同样的值。下面的代码是种错误的写法
class BaseClass {
	private int x;
	
	public BaseClass(int i) {
		x = i;
	}
	
	public boolean equals(Object rhs) {
		if (!(rhs instanceof BaseClass))
			return false;
		return x == ((BaseClass) rhs).x;
	}
}

class DerivedClass extends BaseClass {
	private int y;
	
	public DerivedClass(int i, int j) {
		super(i);
		y = j;
	}
	
	public boolean equals(Object rhs) {
		if(!(rhs instanceof DerivedClass))
			return false;
		return super.equals(rhs) && y == ((DerivedClass) rhs).y;
	}
}

public class EqualWithInheritance {
	public static void main(String[] args) {
		BaseClass a = new BaseClass(5);
		DerivedClass b = new DerivedClass(5, 8);
		DerivedClass c = new DerivedClass(5, 8);
		
		System.out.println("b.equals(c)" + b.equals(c));
		System.out.println("a.equals(b)" + a.equals(b));
		System.out.println("b.equals(a)" + b.equals(a));
		
		System.out.println("b.instanceof BaseClass" + (b instanceof BaseClass));
	}
}




正确的实现应该是
class BaseClass {
	private int x;
	
	public BaseClass(int i) {
		x = i;
	}
	
	public boolean equals(Object rhs) {
		if (rhs == null || getClass() != rhs.getClass())
			return false;
		return x == ((BaseClass) rhs).x;
	}
}

class DerivedClass extends BaseClass {
	private int y;
	
	public DerivedClass(int i, int j) {
		super(i);
		y = j;
	}
	
	public boolean equals(Object rhs) {
		//Class test not needed; getClass() is done in superclass equals
		return super.equals(rhs) && y == ((DerivedClass) rhs).y;
	}
}

public class EqualWithInheritance {
	public static void main(String[] args) {
		BaseClass a = new BaseClass(5);
		DerivedClass b = new DerivedClass(5, 8);
		DerivedClass c = new DerivedClass(5, 8);
		
		System.out.println("b.equals(c)" + b.equals(c));
		System.out.println("a.equals(b)" + a.equals(b));
		System.out.println("b.equals(a)" + b.equals(a));
		
		System.out.println("b.instanceof BaseClass" + (b instanceof BaseClass));
	}
}
分享到:
评论

相关推荐

    Java中equals方法隐藏的陷阱

    ### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    java中equals和==的区别.doc

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...

    2.javaequals()方法.zip

    2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....

    重写equals方法

    在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...

    java_equals用法

    java_equals用法,用来熟悉重写equals方法的

    java中equals()函数的用法 equals和==的区别

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    重载equals方法示例

    重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例

    Java中equals()方法重写实现代码

    Java中equals()方法重写实现代码详解 Java中equals()方法是Object类中定义的,作为所有类的父类,任何类都隐含地继承了该方法。 equals()方法用于判断两个对象的内容是否相同,如果没有重写该方法的类,需要重写该...

    java 资料 equals 与== 的区别

    Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...

    java中equals和==的区别.pdf

    除了String类以外,Java标准库中许多其他类也重写了equals方法,例如包装类Integer、Long等。对于包装类,equals方法不仅比较对象内容,还会考虑它们的数值大小。以下是一个使用Integer类的例子: ```java Integer ...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    equals方法的重写.docx

    `equals`方法是Java语言中Object类的一个重要成员方法,其默认实现是比较两个对象的内存地址是否相同(即是否为同一个对象)。为了使对象之间能够基于内容进行比较,通常需要在具体的类中重写`equals`方法。 #### ...

    Java中的==和equals区别

    ### Java中的`==`与`equals`方法的区别详解 在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的...

    Java语言深入_equals

    Java中的`equals`方法是一个至关重要的方法,用于比较两个对象是否“相等”。在Java API规范中,`equals`方法必须遵循以下五个基本原则: 1. 对于任何引用类型,`o.equals(o)`总是返回`true`。 2. 如果`o.equals(o1...

    java中equals和的比较.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具,但它们之间存在显著的区别。理解这些差异对于编写高效且无误的代码至关重要。 #### 二、基本概念 1. **==(双等号)**: - ...

    浅谈java 重写equals方法的种种坑

    关于 Java 中重写 equals 方法的种种坑 Java 中的 equals 方法是一种用于比较对象是否相等的方法,它是 Object 类中的一个方法。然而,重写 equals 方法并不是一件简单的事情,因为它需要遵守一些约定,否则可能会...

Global site tag (gtag.js) - Google Analytics