重写-Java的Object的equals方法要求有对称性,为什么我的没有符合对称性但是可以正常运行

问题描述

Java的Object的equals方法要求有对称性,为什么我的没有符合对称性但是可以正常运行
/**
*我的t.equals(te)为true

  • te.equals(t)为false
  • 为什么可以正常运行?*/package five;

import java.util.Date;
import java.util.GregorianCalendar;

public class Test3 {

public static void main(String[] args) {      T3 t=new T3();///name=""李楠""      Te3 te=new Te3();////name=""刘洋""      System.out.println(t.equals(te));//true      System.out.println(""=============================="");      System.out.println(te.equals(t));///false}

}
class T3{
public boolean equals(Object otherObject){
if(this==otherObject){
System.out.println(""1"");
return true;
}
if(otherObject==null){
System.out.println(""2"");
return false;
}
if(!(otherObject instanceof T3)){
System.out.println(""4"");
return false;
}
T3 other=(T3) otherObject;
return name.equals(other.name) && salary==other.salary && hireDay.equals(other.hireDay);
}
private String name=""李楠"";
private double salary=50000;
private Date hireDay=new GregorianCalendar(199233).getTime();
}
class Te3 extends T3{
public void s(){
System.out.println(""j"");
}
public boolean equals(Object otherObject){
if(!super.equals(otherObject)){
System.out.println(""5"");
return false;
}
if(otherObject instanceof Te3){
Te3 other=(Te3)otherObject;
return name.equals(other.name) && salary==other.salary && hireDay.equals(other.hireDay);
}
else {
return false;
}
}
private String name=""刘洋"";
private double salary=50000;
private Date hireDay=new GregorianCalendar(199233).getTime();

}

解决方案

看看这篇文章吧,折腾了几天。http://blog.csdn.net/u010569227/article/details/10322895

解决方案二:
基本类型使用==是等于,引用类型是地址相等。if(this==otherObject)这个不会执行。

T3 other = (T3) otherObject;将Te3转为T3,你的属性全是私有,调用了父类的属性,向上转型后使用同名的方法与属性是使用的父类的方法和属性。

if (!(otherObject instanceof T3))是T3之类的对象,这个一直是false。
if (otherObject instanceof Te3) 子类使用的,otherObject是父类,不是子类型。

name.equals(other.name)。私有属性的不可以这么用!!!!!!

解决方案三:
Object类中的euqals方法用来检测一个对象与另一个对象是否相等,其采用的是判断二者是否具有相同的引用,引用相同则一定相等,但是equals方法能够判断引用是否相同来判断比较的对象是否相等, 但不能判断引用不同的对象是否相等 .所以超类中(T3)中有if(this==otherObject)这个方法,用来首先判断两个对象的引用是否相同。

时间: 2024-11-05 12:10:29

重写-Java的Object的equals方法要求有对称性,为什么我的没有符合对称性但是可以正常运行的相关文章

Java编程中的equals方法使用全解_java

通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static void main(String[] args) { /** * 这里使用构造方法Cat()在堆内存里面new出了两只猫, * 这两只猫的color,weight,height都是一样的, * 但c1和c2却永远不会相等,这是因为c1和c2分别为堆内存里面两只猫的引用对象, * 里面装着可以找到这两只猫的地址,但由于两只猫在堆内存里面存

问一个Object的equals方法的问题

问题描述 thinking in java上面的例子:class Value{ int i;}public class Equals{public static void main(String[] args){Value value1 = new Value();Value value2 = new Value();value1.i = 100;value2.i = 100;System.out.println(value1.equals(value2));}}输出是false.然后我覆盖了h

Java:所有的equals方法实现都是错误的?

本文介绍了一种改写(override)equals 方法的技巧.使用该技巧,即使在实体类的子类添加了新的域(field)时,仍然能够满足 equals 方法的约定. 在<Effective Java>一书的第 8 条目中,Josh Bloch 将子类化时满足 equals 约定这一困难描述为:面向对象语言中等值关系的最根本问题.Bloch 这样写道: 不存在一种方式,能够在扩展非实例类并添加值组件的同时,仍然满足equals的约定.除非你愿意放弃面向对象的抽象性这一优点. <Progra

为什么在Java中object.wait()/notify()方法必须在持有锁的情况下才能执行?

问题描述 为什么必须只有锁?我说的是为什么这么设计,不是说这样用的话就会抛异常.. 解决方案 只有两个线程抢一个资源的时候才存在两个线程同一时刻只能有一个线程得到资源,锁就是为了使两个线程抢同一个资源,如果没有锁,意思是两个线程不存在抢资源情况,那两个线程凭什么你等我 我等你,早就一起跑了.解决方案二:补充一下,wait逻辑通常是两步操作: (1)先判断特定的条件是否满足,如果不满足,(2)则进入wait.如果没有同步保护,就可能设置条件+唤醒的操作插入在这两步操作中间执行(1和2中间),造成w

java为什么要重写hashCode和equals方法

  如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值.       不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2).   为什么需要重写equals和hashCode方法?       在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等.在这种情况下,原生的equals方法就不能满足我们的需求了    

对象-java中重写equals方法为什么不直接在里面比较hashcode()?

问题描述 java中重写equals方法为什么不直接在里面比较hashcode()? 看书上说只要重写在一个类中重写equals方法,那就一定要重写hashcode方法,因为两个对象只要equals返回值为true,那么他俩的hashcode就一定相同. 那为什么不可以提前先写好hashcode函数,然后在equals函数里面直接来一行if(this.hashcode() == otherObject.hashcode()) return true;else return false;就行了?

Java equals 方法与hashcode 方法的深入解析

面试时经常会问起字符串比较相关的问题,比如:字符串比较时用的什么方法,内部实现如何?hashcode的作用,以及重写equal方法,为什么要重写hashcode方法?以下就为大家解答,需要的朋友可以参考下   PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下:    /**      * Indicates whether some other object is "equal to" this one.      * <p>   

对于java equals方法的疑惑。

问题描述 对于java equals方法的疑惑. String s1 = new String("123"); String s2 = new String("123"); System.out.println(s1.equals(s2)); Test t1=new Test("123"); Test t2=new Test("123"); System.out.println(t1.equals(t2)); 为何上面输出的是

重写了equals()方法之后也必须重写hashCode()方法

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样 对于值对象,==比较的是两个对象的值 对于引用对象,比较的是两个对象的地址 默认的equals方法同==,一般来说我们的对象都是引用对象,要重写equ