我正在研究OCJP转储,有一个问题:
public class Person{
private String name;
public Person (String name) {this.name=name;}
public boolean equals(Person p){
return p.name.equals(this.name);
}
}
给出上述代码的哪个陈述是真的?
一个。 equals方法没有正确覆盖Object.equals方法
B中。编译失败,因为在第5行中无法访问私有属性p.name
℃。要正确使用基于散列的数据结构,此类还必须实现hashCode方法。
d。将Person对象添加到java.util.Set集合时,第4行中的equals方法将防止重复。
在转储中,正确的答案是A.我认为equals方法不起作用,因为p.name是私有的。因此B也是对的。如果B不正确,那么equals方法的另一个问题是什么?
答案 0 :(得分:2)
一个。 equals方法没有正确覆盖Object.equals方法。
A
是正确的答案。因为equals方法的签名是:
public boolean equals(Object obj)
我认为equals方法不起作用,因为p.name是私有的。因此B也是对的
name
是私有成员,但私有成员始终可以在声明的类中访问。您正在覆盖同一班级中的equals
。所以它会编译。所以B不是一个正确的答案。
答案 1 :(得分:1)
A。为true,因为Object类中的equals方法具有签名
public boolean equals(Object other);
因此无法通过方法
覆盖public boolean equals(Person other);
因为参数类型不匹配。
B。为false,因为私有修饰符限制对其声明的顶级类的主体的访问(而不是当前对象,正如您所想的那样)并且声明和访问发生在同一个类的主体内,因此访问完全有效。