日期:2014-05-20  浏览次数:20679 次

SCJP 考题一道:equals()方法的重写
Given:
Java code

1. public class Person{
2.   private String name;
3.   public Person(String name){this.name = name;}
4.   public boolean equals(Person p){
5.     return p.name.equals(this.name);
6.   }
7. }
Which statement is true?


A. The equals method does NOT properly override the Object.equals method.
B. Compilation fails because the private attribute p.name cannot be accessed in line 5.
C. To work correctly with hash-based data structures, this class must also implement the hashCode method.
D. When adding Person objects to a java.util.Set collection, the equals method in line 4 will prevent duplicates.


请问应该选哪个,不对的错在哪里。多谢。

------解决方案--------------------
A为正确答案(形参中为Object类型

B中是可以访问的
C:没写,就会调用默认的父类hashCode方法
D:由于不是重写equals方法,所以不会调用该方法
------解决方案--------------------
http://singandsuny.blog.163.com/blog/static/186668822009112743357710/
这个里面详细介绍,希望对楼主有帮助
------解决方案--------------------
A,就像6楼解释的那样
不过C的错误和6楼理解不太一样,如果不重写hashCode回调用父类Object的hashCode方法,但这个就不能算是work correctly了吧,我的理解是,他连equals都没重写好,这条直接免谈了……
------解决方案--------------------
A 因为参数不是Object所以没有重写public boolean equals(Object p)
B 不对,当前类能访问private的属性
C 可以重写也可以不重写,不重写会调用父类的,只是效率差点
D 当往set中加入的时候并不会使用此equals方法,会调用父类的equals方法,因为该方法没有被重写
------解决方案--------------------
D不对
因为Person根本没重写object中的equals方法
所以加入hashset时候,还是调用的objectequals方法
代码测试过如下
main方法
Java code
 public static void main(String ... args) throws Exception {
        HashSet s=new HashSet();
        System.out.println(s.add(new Person("name")));
        System.out.println(s.add(new Person("name")));
        
      }