问答详情
源自:9-9 Java 中的 Object 类 Ⅱ

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

}


提问者:Edward_Xie 2016-07-22 22:14

个回答

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

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

  • 一个顶俩的浪客
    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;
     }
    }



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

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