use*_*847 10 java casting equals
我有一个关于equals在Java中覆盖该方法的问题.在我的书中,我有以下示例:
public class Dog{
private String name;
private int age;
public boolean equals(Object obj) {
if(!(obj instanceof Dog)) return false;
Dog other = (Dog) obj; ---> confused here
if(this.name.equals(other.name) && (this.age == other.age) {
return true;
}
else {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么必须将引用转换为Dog引用.如果该引用不是类型,Dog则返回false.为什么所有的麻烦与铸造呢?
声明的类型obj是Object,所以你必须强制它告诉编译器它是一个Dog.
虽然逻辑上它在代码中的那个点上不是任何其他东西,但编译器对逻辑一无所知 - 它只知道类型.
因为您要定义自己的相等性参数,所以必须确保它们是同一类。也就是说,除非您==以某种方式比较它们,否则您需要比较对象内部的某些值。要比较对象内部的值,它们必须是同一类型!
例如,假设您有两个Dog。
Dog dog1 = new Dog("Fido");
Dog dog2 = new Dog("Rover");
Run Code Online (Sandbox Code Playgroud)
如果您想测试一下它们是否具有相同的名称,那么我可以确定,您不能使用:
if(dog1 == dog2)
Run Code Online (Sandbox Code Playgroud)
因此,您覆盖了equals方法。但是,由于要覆盖它,因此它必须具有相同的方法签名。方法签名由方法的名称,参数的数量和类型定义。这意味着,如果您想覆盖它,则需要具有type参数Object。因此:
if(dog1.equals(dog2))
Run Code Online (Sandbox Code Playgroud)
您需要将其强制转换为使用name从狗中获取值并比较这些值的任何方法的原因。
关于班级设计的注意事项
面向对象编程以及Java中的约定是必须具有Accessor和Mutator方法来获取和更改类中的变量。那是:
dog1.name; ----> dog1.getName();
Run Code Online (Sandbox Code Playgroud)
其中getName()的样子:
public String getName()
{
return name;
}
Run Code Online (Sandbox Code Playgroud)