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

来源:9-9 Java 中的 Object 类 Ⅱ

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("不相同");
		}
		
	}

}


写回答 关注

4回答

  • 有些人一直都在
    2016-07-24 11:58:17
    已采纳

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

    Edward...

    非常感谢!

    2016-07-24 17:41:06

    共 1 条回复 >

  • 一个顶俩的浪客
    2016-08-04 17:15:46

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

                return false;

    理解这一句的含义。


  • 有些人一直都在
    2016-07-24 11:20:02

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



    南山至南

    你说的不对吧,if (this == obj),return true;这行代码判断了两个对象是否为同一对象,不论是一个类创建两个对象,还是两个类创建两个对象,这行代码肯定不会通过,继续执行下面代码进行判断,后边的代码怎么不会执行了?

    2016-08-03 18:13:33

    共 1 条回复 >

  • xuzhen
    2016-07-22 22:42:45

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

    Edward... 回复有些人一直都...

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

    2016-07-24 10:44:40

    共 3 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530777 学习 · 6091 问题

查看课程

相似问题