Java - 抽象类、equals() 和两个子类

标签 java abstract-class subclass equals abstract

我有一个名为Xpto 的抽象类和两个扩展它的子类PersonCar。我还有一个名为 Test 的类,带有 main() 和一个方法 foo() 来验证两个人或汽车(或扩展 Xpto 的类的任何对象)是否等于。因此,我在 Person 和 Car 类中重新定义了 equals()。两个人同名是平等的,两车同号也是平等的。

但是,当我在测试类中调用 foo() 时,我总是得到“false”。我明白为什么:equals() 没有在 Xpto 抽象类中重新定义。那么...如何在 foo() 方法中比较两个人或汽车(或扩展 Xpto 的类的任何对象)?

总而言之,这是我的代码:

public  abstract class Xpto {


}

public class Person extends Xpto{

        protected String name;

        public Person(String name){
                this.name = name;
        }

        public boolean equals(Person p){
                System.out.println("Person equals()?");
                return this.name.compareTo(p.name) == 0 ? true : false;
        }
}

public class Car extends Xpto{
        protected String registration;

        public Car(String registration){
                this.registration = registration;
        }

        public boolean equals(Car car){
                System.out.println("Car equals()?");
                return this.registration.compareTo(car.registration) == 0 ? true : false;
        }
}

public class Teste {

        public static void foo(Xpto xpto1, Xpto xpto2){
                if(xpto1.equals(xpto2))
                        System.out.println("xpto1.equals(xpto2) -> true");
                else
                        System.out.println("xpto1.equals(xpto2) -> false");

        }

        public static void main(String argv[]){
                Car c1 = new Car("ABC");
                Car c2 = new Car("DEF");
                Person p1 = new Person("Manel");
                Person p2 = new Person("Manel");

                foo(p1,p2);
        }
}

最佳答案

正如其他人所说,您重写的方法的签名必须完全相同。覆盖方法时,为确保您正在覆盖,请在函数上方使用 @Override 注释,这样如果您更改了方法,像 Eclipse 这样的 IDE 会警告您。

这是它的样子:

@Override
public boolean equals(Object obj){
...Your code here...
}

我建议也重写 hashCode(),因为在将项目插入列表、集合、hastables 等时...为了相等(和执行)hashCode() 被使用(有时 equals() 不是!)

所以你的最终代码是:

@Override
public boolean equals(Object obj){
...Your code here...
}

@Override
public int hashCode(){
...Your code here...
}

更多信息请访问 javadoc

关于Java - 抽象类、equals() 和两个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2698419/

相关文章:

java - JAVA执行Unix系统命令问题

c# - 重写抽象方法的 System.AccessViolationException

Java 回文、方法和抽象类?

java - 尝试添加循环

java - CyclicBarrier/CountDownLatch 和 Java 中的 join 有什么区别?

ios - UIBezierPath子类初始化器

java - 为什么我不能更改子类值

java - 当 Vector 位于包含类中时,使用 Vector 的 addAll( ) 函数时出现问题

Java Swing Timer无限循环

javascript - ECMAScript 6 是否有抽象类的约定?