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

怎么比较两个不同子类的值是否相等?

package com.imooc;

public class Animal {
    public String name;
    public int age;

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Animal other = (Animal) obj;
        if (age != other.age)
            return false;
        return true;
    }
}
package com.imooc;

public class Dog extends Animal {

}
package com.imooc;

public class Cat extends Animal {

}
package com.imooc;

public class Initial {
    public static void main(String[] args) {

        Dog dog = new Dog();
        Dog dog2=new Dog();
        Cat cat = new Cat();
        dog.age=1;
        dog2.age=1;
        cat.age=1;

        if(dog.equals(dog2)){
            System.out.println("dog和dog2的age相同");
        }else{
            System.out.println("dog和dog2的age不同");
        }

        if(dog.equals(cat)){
            System.out.println("dog和cat的age相同");
        }else{
            System.out.println("dog和cat的age不同");
        }
    }
}

结果为dog和dog2的age相同,dog和cat的age不同

为什么new同一个子类时,equals可以比较属性值,而new不同子类时,不能比较属性值,怎么修改才能比较不同子类的属性值

谢谢


正在回答

12 回答

把 这个代码换成下面那个

 Cat cat = new Cat();

换成这个以后 就是相同的了

Dog cat = new Dog();


至于为啥比较出来不相同 是因为 它们的类型就是不一样的 所以还没有比到值 直接在类型这里就返回 flase了

所以不同,修改成相同的类型以后就能比较了

还有想比较两个类的数据是否相同 可以直接使用 == 来进行对比

if (dog.age  == dog2.age){

      System.out.println("dog和dog2的age相同");

        }else{

            System.out.println("dog和dog2的age不同");

        }

        

if (dog.age  == cat.age=1){

     System.out.println("dog和cat的age相同");

        }else{

            System.out.println("dog和cat的age不同");

        }

这样就可以对比了=-= 简单粗暴~望采纳

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

Half_Life 提问者

Animal[] animal={new Dog(),new Cat()} 这样的话好像就不可以了,具体请看楼下,谢谢
2016-04-08 回复 有任何疑惑可以回复我~

都是初学者,好吧,哭

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

天呐,能不能用简单一点的代码来写啊。这本身不是很复杂的问题,但是你的代码看得我眼花了。

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

是的 目前我们所学的知识就是后面可以这么去理解 等到后面慢慢累积了更多知识了 就会理解的更加透彻,现在先理解大概是个啥意思有一个认识 就好了 不能说完全懂了 也不能完全都不懂 ,我现在和你所说的这些也算是我个人学到现在的一些理解,有的地方也不是百分之百正确,基本上大概这么个意思 所以有的东西还是需要自己多多去琢磨 自己琢磨透彻了 在听别人稍微讲解一下 是很容易理解 和加深记忆的~

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

Half_Life 提问者

int i1=1;//基本数据类型 Integer i3=new Integer(1);//引用数据类型,利用包装类把基本数据类型包装成引用数据类型 基本数据类型如果变量值相等,则两个变量都指向同一个内存地址; 引用数据类型即使变量值相等,也可能引用的是不同的内存地址 ==比较内存地址,equals()比较值 基本数据类型包括byte, short, long, int, float, double, boolean, char 引用数据类型包括字符串String、数组、类、接口
2016-04-09 回复 有任何疑惑可以回复我~
#2

Half_Life 提问者

比较基本数据类型时用==,应用数据类型时用equals()
2016-04-09 回复 有任何疑惑可以回复我~
#3

qq_文_17 回复 Half_Life 提问者

哈哈,阔以的! 这样总结一下 理解的就清晰多了,不会迷糊了~ 学习路漫漫~ 多多努力~
2016-04-11 回复 有任何疑惑可以回复我~

new 同一个类 用==比较的是 它们的类型 或者说是内存地址 这个东西它们是使用的一样的


不同类的时候 == 就无法比较类了,因为 类型不同 所在的 空间地址也不一样 内存地址也是不同的


但是 equals() 在String 字符串中 比较的时候 他比较的是两个 变量的 内容是不是一样的 并不是去比较类型

和内存地址 所以不同的类 就是 需要使用equals()来比较 


equals() 重写 只是拿来比较对象的  来对比这个两个 对象中间的类型 是否一致 它的属性是否一致

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

Half_Life 提问者

谢谢,有点懂了,也还是有点迷糊。。。 ==在比较基本数据的时候是直接比较的数值,在比较引用数据类型的时候比较的是内存地址。 而视频例子中如果比较的是dog.age==dog2.age,也就是在比较基本数据类型所以可以用==,但视频中比较的是dog==dog2,所以就必须用equals(),而且还因为分别new了,所以内存地址不同,就必须重写equals()才可以比较数值
2016-04-08 回复 有任何疑惑可以回复我~
#2

qq_文_17 回复 Half_Life 提问者

http://zhidao.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs6-NswPnHsb-O44XPBdACIwXxuD4-Lnymko8aLVTm_WolnxFX7OmWuxjHJf57d9DsHoON6X_MauWt23wJxei24K 有时间可以看看这个 上面的回答比较直接简明一些
2016-04-09 回复 有任何疑惑可以回复我~
name 测试过调试输出 name[i] 有数值吗? =-= 正常赋值了以后是可以判断和对比的

但是不要用等于号了 直接用   equals() 比较 

猫.equals("猫")  这样就是判断 猫这个字符串是否和 猫这个字符串 相等


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

Half_Life 提问者

迷糊了,为什么new同一个类的时候==就可以了,new不同类的时候直接equals()就可以了,但是例子中的quals()重写啥时候用?
2016-04-08 回复 有任何疑惑可以回复我~
#2

qq_文_17 回复 Half_Life 提问者

new 同一个类 用==比较的是 它们的类型 或者说是内存地址 这个东西它们是使用的一样的 不同类的时候 == 就无法比较类了,因为 类型不同 所在的 空间地址也不一样 内存地址也是不同的 但是 equals() 在String 字符串中 比较的时候 他比较的是两个 变量的 内容是不是一样的 并不是去比较类型 和内存地址 所以不同的类 就是 需要使用equals()来比较 equals() 重写 只是拿来比较对象的 来对比这个两个 对象中间的类型 是否一致 它的属性是否一致 ​
2016-04-08 回复 有任何疑惑可以回复我~
package com.imooc;

public class Animal{
    String name;
    int no;
}
package com.imooc;

public class Dog extends Animal {
    public Dog(){
    this.name="狗";
    this.no=1;
    }
}
package com.imooc;

public class Cat extends Animal {
    public Cat(){
    this.name="猫";
    this.no=2;
    }
}
package com.imooc;
import java.util.Scanner;

public class Initial {
    static Animal[] animal={new Dog(),new Cat()};
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.println("请选择方式:\n1.按品种选择\n2.按序号选择");
        int choose=input.nextInt();
        if(choose==1){
            searchByName(animal);
        }else if(choose==2){
            searchByAge(animal);
        }
        input.close();
    }
    static void searchByName(Animal[] animal){
        Scanner input=new Scanner(System.in);
        System.out.println("全部动物如下:\n序号\t品种");
        for(int i=0;i<animal.length;i++){
            System.out.println(animal[i].no+"\t"+animal[i].name);
        }
        System.out.print("请输入动物名:");
        String choose1=input.next();
        for(int i=0;i<animal.length;i++){
            System.out.println(animal[i].name+choose1);
            if(animal[i].name==choose1){
                System.out.println("选择"+choose1+"成功");
                exitOrContinue(1);
            }else if(i==animal.length-1&&choose1!=animal[i].name){
                System.out.println("选择"+choose1+"失败");
                exitOrContinue(1);
            }
        }
        input.close();
    }
    static void searchByAge(Animal[] animal){
        Scanner input=new Scanner(System.in);
        System.out.println("全部动物如下:\n序号\t品种");
        for(int i=0;i<animal.length;i++){
            System.out.println(animal[i].no+"\t"+animal[i].name);
        }
        System.out.println("\n请输入序号");
        int choose2=input.nextInt();
        if(choose2>0&&choose2<=animal.length){
            if(choose2==animal[(choose2-1)].no){
                System.out.println("选择"+choose2+"成功");
                exitOrContinue(2);
            }else{
                System.out.println("选择"+choose2+"失败");
                exitOrContinue(2);
            }
        }
        input.close();
    }
    static void exitOrContinue(int eoc){
        Scanner input=new Scanner(System.in);
        System.out.println("是否继续:\n1.继续选择\n2.退出");
        int choose3=input.nextInt();
        if(choose3==1){
            if(eoc==1){
                searchByName(animal);
            }else if(eoc==2){
                searchByAge(animal);
            }
         }else if(choose3==2){
            System.out.println("欢迎下次再来!");
        }
        input.close();
    }
}

no正常判断,name就无法正常判断了,即使是有值的

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

要想nuw出来的东西直接带有值

在子类里面 构造一个方法 在这个里面赋值

public class Cat extends Animal{

public  Cat(){

name ="狗";

age = 2;

}

}

这样nuw出来的时候就直接有值了!


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

Half_Life 提问者

谢谢,我改好了之后,age可以判断了,但是name还是无法判断,name是不是就要用到重写equals()?还是别的,麻烦了
2016-04-08 回复 有任何疑惑可以回复我~

animal[0].name = "狗";

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

System.out.println(animal[0].name);

       System.out.println(animal[1].name);


在nuw了以后 打印这句话 你会发现你对象里面的 name是空的 木有值 所以找不到 


你给它赋予一个值以后 就可以去对比了 还有 字符串 是用 equals 去比较呢 


基本数据类型 比如 整形 布尔  浮点型 就用  == 去比较

0 回复 有任何疑惑可以回复我~
首页上一页12下一页尾页

举报

0/150
提交
取消

怎么比较两个不同子类的值是否相等?

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