为了账号安全,请及时绑定邮箱和手机立即绑定

如视频教程,若我用父类animal创建一个对象dog,,用子类dog创建一个dog2,并对两个对象的name和age赋相同的值,用equal方法对比时为什么显示不相同?

如视频教程,若我用父类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("不相同");
		}
		
	}

}


正在回答

4 回答

http://img1.sycdn.imooc.com//57943c9d00012c7505470880.jpg我刚又问了一下我们老师、不同类中的对象根本就没有可比性

0 回复 有任何疑惑可以回复我~
#1

Edward_Xie 提问者

非常感谢!
2016-07-24 回复 有任何疑惑可以回复我~

if (getClass() != obj.getClass())

            return false;

理解这一句的含义。


0 回复 有任何疑惑可以回复我~

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;
 }
}



0 回复 有任何疑惑可以回复我~
#1

南山至南

你说的不对吧,if (this == obj),return true;这行代码判断了两个对象是否为同一对象,不论是一个类创建两个对象,还是两个类创建两个对象,这行代码肯定不会通过,继续执行下面代码进行判断,后边的代码怎么不会执行了?
2016-08-03 回复 有任何疑惑可以回复我~

equal比较的是两个对象的内存地址。因为实例化的两个对象虽然对象属性是相同的,但是他们的地址不同,所以equal比较也会不同

0 回复 有任何疑惑可以回复我~
#1

Edward_Xie 提问者

不好意思,我没说清楚问题,我是用源码里的改过的equal,用来对比属性的equal
2016-07-23 回复 有任何疑惑可以回复我~
#2

有些人一直都在 回复 Edward_Xie 提问者

可以再详细的说一下你的问题吗,看不太明白你想问什么
2016-07-24 回复 有任何疑惑可以回复我~
#3

Edward_Xie 提问者 回复 有些人一直都在

如上代码,我创建了两个类,pig和pig2,他们都只有两个属性,age和name,且都初始化为相同的值,然后我重写了pig类中的equals代码,让他实现比较两个对象属性是否相等的功能,最后在主函数中创建两个类的对象,用equals对比的时候发现输出不相同,可是我的两个对象属性一样,值也一样,不知道为什么?是不是只有子类对象和父类对象对比才可能相等?
2016-07-24 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

如视频教程,若我用父类animal创建一个对象dog,,用子类dog创建一个dog2,并对两个对象的name和age赋相同的值,用equal方法对比时为什么显示不相同?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信