Edward_Xie
2016-07-22 22:14
如视频教程,若我用父类animal创建一个对象dog,,用子类dog创建一个dog2,并对两个对象的name和age赋相同的值,用源码改过equal方法,对比时为什么显示不相同?核心代码如下:
package com.imooc; public class Pig { public int age=20; public String name="pig"; @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Pig other = (Pig) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class Pig2{ public int age=20; public String name="pig"; } public class Initial { public static void main(String[] args) { Pig pig=new Pig(); Pig2 pig2=new Pig2(); if(pig.equals(pig2)){ System.out.println("相同"); }else { System.out.println("不相同"); } } }
我刚又问了一下我们老师、不同类中的对象根本就没有可比性
if (getClass() != obj.getClass())
return false;
理解这一句的含义。
equals()方法比较的是同一个类中的多个对象,你创建了两个类,两个类中的对象引用地址肯定不相同啊,代码 if (this == obj),return true;就是判断引用地址是否相同,这一步得到的是false,后面就不再执行了,直接到最后运行结果“不相同”、我把视频里的代码在eclipse敲出来了,有注释,你可以看下。
public class Mk0_4 {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.a = "imooc";
p1.b = 20;
p1.c = 3.14f;
Phone p2 = new Phone();
p2.a = "imooc";
p2.b = 20;
p2.c = 3.14f;
if(p1.equals(p2)){
System.out.println("两个对象相同");
}else{
System.out.println("两个对象不相同");
}
}
}
class Phone{
String a;
int b;
float c;
//比较两个对象中的每一个值
public boolean equals(Object obj) {
if (this == obj)//判断两个引用的值是否相等,即引用的地址是否相同,若引用地址相同,则是同一个值返回true
return true;
if (obj == null)//若一个对象的值为空值,则无意义,返回false
return false;
if (getClass() != obj.getClass())//getClass得到的是类对象,new一个对象时,得到的是类的对象,obj.getClass得到的是类的对象,此行代码通过类对象判断两个对象的类型是否相同
return false;//若两个对象的类型都不相同则肯定不相同,返回false
Phone other = (Phone) obj;//执行到这里则两个对象的类型肯定相同,则可以将传进来的对象转换为Phone类型
if (a == null) {//转换为相同的类型后才可以进行属性比较,若两个对象的属性值相同,则两个对象相同
if (other.a != null)
return false;
} else if (!a.equals(other.a))
return false;
if (b != other.b)
return false;
if (Float.floatToIntBits(c) != Float.floatToIntBits(other.c))
return false;
return true;
}
}
equal比较的是两个对象的内存地址。因为实例化的两个对象虽然对象属性是相同的,但是他们的地址不同,所以equal比较也会不同
Java入门第二季 升级版
530777 学习 · 6091 问题
相似问题