如何确定Student类的两个实例是否代表同一个学生?

2 java

我有一个Java类

class Student
{
    String name;
    int age;
}
Run Code Online (Sandbox Code Playgroud)

另外,我有学生类的两个实例student1student2.

找出两个实例是否代表"同一学生"的一种方法是手动比较数据,即名称和年龄.如果它们是相同的,那么它们代表"同一个学生".

有没有其他方法可以找出这两个实例是否代表"同一个学生"?

PS我在接受采访时被问到这个问题.我仍然不完全理解"同一个学生"这个短语.我猜它在现实世界中意味着同一个学生.如果没有,面试官还有什么意思呢?

cor*_*iKa 7

什么标识学生?

除了名字和年龄,我们什么都没有.现在,你可能有两个同名的人,但可能没有.无论如何,我不认为年龄是识别某人的东西 - 不像名字那样.

所以我会这样做

public boolean equals(Object o) {
    if(!o instanceof Student) return false;
    Student s = (Student)o;
    return o.name.equals(this.name);
}
Run Code Online (Sandbox Code Playgroud)

如果您是Java新手,Object类有一个方法public boolean equals(Object o).因为Java中的每个对象都继承自Object,所以无论是否需要,它们都拥有该方法.默认实现只是比较内存中的地址.所以如果你这样做的话

Student s = new Student();
Student t = new Student();
boolean e = (s == t); // always false
boolean q = s.equals(t); // always false if not overridden
Run Code Online (Sandbox Code Playgroud)

现在,我编写的这个特殊方法不执行空检查,如果它在生产代码中,您可以执行此操作.

  • 我的理解是==引用引用相等,即s == t iff s和t是相同的引用,因此你的注释是错误的,即使它们的.equals方法被覆盖,==也不会返回true. (2认同)
  • @glowcoder - 你的评论非常具有误导性,你说"如果我们不重写equals()将会是假的",暗示如果我们这样做会是真的...... (2认同)

kgr*_*rad 5

Java中同一学生有两种定义(如果学生是一个对象).存在这样的情况:学生具有相同的名称和年龄,可以通过实现.equals()方法来检查.这意味着它们的价值是相等的.

@Override
public boolean equals(Object o) {
    //check if the student's age and name are equal
}
Run Code Online (Sandbox Code Playgroud)

第二种情况是指当两个不同的变量指向同一个实际对象时,这称为引用相等,可以使用==进行测试.

if (student1 == student2)
Run Code Online (Sandbox Code Playgroud)

  • +1提及"参照平等".我认为这是OP的正确答案. (4认同)