仅在两个实例之间比较一个变量

时间:2019-03-13 16:01:35

标签: java oop

我正在学习Java,他们给了我一个我非常努力的练习。我将为您提供完整的练习(从我的母语翻译而来),而不是对其进行解释,因此您可以理解它。 我真的不明白我该怎么做。我不假装完整的代码(即使我会很欣赏,因为制作精良的代码可以帮助我改善并更好地理解应该如何做),但至少我想知道我应该从哪里开始寻找对于解决方案,因为现在我撞墙了,很痛。

我的第一个想法是重写.equals方法,但这似乎不正确。我以为我可以创建一个子类,但在示例中,它们对主实例和3个派生实例都使用相同的类,所以不是。

锻炼:

创建一个Animal类,其特征在于:

  • 腿数
  • 类型(鸟,猫等)
  • 平均体重

如果两只动物的腿数相同,属于同一类型并且具有相同的平均体重,则认为它们相等。 该类必须实现三种方法,这些方法允许转换动物,以便仅比较特征之一 (针对每种特征的一种方法)。


示例:

    Animal cat = new Animal (4, "Cat", 5);
    Animal dog = new Animal (4, "Dog", 5);

    Animal catNumberOfLegs = cat.compareNumberOfLegs();
    Animal catType = cat.compareType ();
    Animal catWeigth = cat.compareWeigth();

    Animal dogNumberOfLegs = dog.compareNumberOfLegs ();
    Animal dogType = dog.compareType ();
    Animal dogWeigth = dog.compareWeigth ();

    System.out.println (cat.equals (dog)); // false
    System.out.println (catNumberOfLegs.equals (dogNumberOfLegs)); // true
    System.out.println (catType.equals (dogType)); // false
    System.out.println (catWeigth.equals (dogWeigth)); // true

------------
  • 变量的值必须保持不变。

  • Java是一种面向对象的语言:记住它!

编辑: 我正在编辑此原因,因为我在评论中看到了一些困惑,不知道这是造成练习写得不好还是造成翻译的原因。

要点是,我有两个Animal类的实例。一个叫猫,另一个叫狗。我有这3个单独的方法来实现,当在实例上使用时,返回给我一个新实例,该实例仅在使用.equals()时将其中一个变量考虑在内。让我们采用方法“ compareNumberOfLegs();”。举个例子。 动物dogTWO = dog.compareNumberOfLegs(); 动物catTWO = cat.compareNumberOfLegs(); 这意味着“ dogTWO”将是一个新实例,它将保留“ dog”的所有内容,但是如果与使用.equals()的“ catTWO”进行比较,我将得到“ True”,因为仅会比较“ numberOfLegs”。 / p>

2 个答案:

答案 0 :(得分:5)

在Animal类中,您必须实现equals()方法。

equals()是默认实现的,因为它是Object的一种方法,但是您必须为实现目标而覆盖其行为,

因此您进入了Animal班:

public boolean equals(Object value) {
    if (value == null) return false;
    if  (!value instanceof Animal) return false;
    Animal other = (Animal)value;

    if (this.numberOfLegs != other.getNumberOfLegs()) return false;
    if (this.type.equals(other.getType()) return false;
    if (this.weigth != other.getWeigth()) return false;
    return true;
}

因此,您有对象实例catdog,可以调用cat.equals(dog);

答案 1 :(得分:1)

您可以通过扩展Animal来实现这一点,以便每个子类都覆盖equals以仅检查一个属性。然后,每个compareX方法都返回专门的子类。

以下代码可以让您对从何处开始有所了解:

class Animal {
    // Class attributes

    class AnimalWithLegs extends Animal {
        public AnimalWithLegs(Animal base) { /* ... */ }

        @Override
        public boolean equals(Object o) { /* ... */ }
    }


    class AnimalWithType extends Animal {
        public AnimalWithLegs(Animal base) { /* ... */ }

        @Override
        public boolean equals(Object o) { /* ... */ }
    }


    class AnimalWithWeight extends Animal {
        public AnimalWithLegs(Animal base) { /* ... */ }

        @Override
        public boolean equals(Object o) { /* ... */ }
    }

    public Animal compareNumberOfLegs() {
        return new AnimalWithLegs(this);
    }

    public Animal compareType() {
        return new AnimalWithType(this);
    }

    public Animal compareWeight() {
        return new AnimalWithWeight(this);
    }

    @Override
    public boolean equals(Object o) { /* ... */ }
}