覆盖Java中的equals()方法(OCJP)

时间:2015-11-01 02:19:36

标签: java equals scjp

我正在研究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方法的另一个问题是什么?

2 个答案:

答案 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,因为私有修饰符限制对其声明的顶级类的主体的访问(而不是当前对象,正如您所想的那样)并且声明和访问发生在同一个类的主体内,因此访问完全有效。