代码之家  ›  专栏  ›  技术社区  ›  Deepu--Java

如何更改student类,使s1==s2在s1=new student()和s2=new student()时返回true?

  •  2
  • Deepu--Java  · 技术社区  · 6 年前

    在我的一次面试中,一位面试官问我:

    给予 Student 类和两个对象 s1 s2 :

    s1 = new Student();
    s2 = new Student();
    

    将怎样 s1 == s2 返回 true ?

    我叫他做 学生 甲级独生子女,但他拒绝了,我们必须改变班级级别,这样 s1==s2 会回来的 .

    注意:我们需要改变 学生 上课。请不要回答 s1=s2 . 有线索吗?

    6 回复  |  直到 6 年前
        1
  •  3
  •   Eran    6 年前

    更改 Student 构造函数抛出一些异常(我选择了未经检查的异常,因此不必在throws子句中指定它):

    public Student()
    {
        throw new NullPointerException();
    }
    

    现在,假设允许我们添加try catch块:

    Student s1 = null;
    Student s2 = null;
    try {
        s1 = new Student(); 
        s2 = new Student();
    }
    catch (Exception e) {
    }
    System.out.println (s1==s2);
    

    这将打印 true ,因为两者 s1 s2 null .

    即使我们没有抓住例外, s1 == s2 在两个构造函数调用之后仍然是正确的(实际上是在第一个构造函数调用之后,因为第二个构造函数永远不会执行),但是我们必须在某个地方捕获异常才能对其进行测试。

        2
  •  5
  •   Davide Lorenzo MARINO    6 年前

    接线员 == 检查两个对象是否相同。 您创建了两个不同的equals对象。 所以他们不一样 s1 == s2 将返回False。 你必须重新定义方法 equals 用以下方法检查:

    s1.equals(s2)
    

    方法 equals :

    指示其他对象是否“等于”此对象。

    请注意,重新定义方法equals时,还需要重新定义方法hashcode,如equals方法说明中明确说明的:

    请注意,每当重写此方法时,通常都需要重写hashcode方法,以便维护hashcode方法的一般约定,该约定声明相等的对象必须具有相等的hash代码。

    通常ide(比如intellij、eclipse或netbeans)可以帮助您编写这两种方法的良好实现。

    考虑到这一点,我想面试官问了如下问题 s1如何等于s2 谈论它,你误解为 s1(simble等于)s2 . 或者他已经明确写了接线员 = 在报纸上?


    如果面试官明确要求

    s1 == s2 // returns true
    

    在将两个对象创建为

    Student s1 = new Student();
    Student s2 = new Student();
    

    唯一的可能性是将s1(或s2)的引用更改如下:

    Student s1 = new Student();
    Student s2 = new Student();
    
    s1 = s2;  // new added line , or the same if you write s2 == s1
    
    s1 == s2  // now is true
    

    但这是一个技巧,事实上你是在测试两个不同的变量引用同一个对象。

    可以将类似的行为分配给这两个变量 null ,或其他 Student 以前创建的。基本上对分配给 s1 相同的参考 s2 会有用的。

        3
  •  2
  •   vincrichaud Azhar Mehmood    6 年前

    已经回答过了 here , == 比较引用。如果 s1 s2 指向同一个对象。因为你在使用 new 将两者都实例化 S1 S2 ,你的要求只是 不可能的 .

        4
  •  1
  •   IgrewupwithSlackware    6 年前

    我看到的唯一逻辑解决方案是琐碎的:

    s1 = new Student();
    s2 = new Student();
    s1=null;
    s2=null;
    System.out.println(s1==s2);
    

    或:

    s1 = new Student();
    s2 = new Student();
    s1=s2;
    System.out.println(s1==s2);
    

    或:

    s1 = new Student();
    s2 = new Student();
    s2=s1;
    System.out.println(s1==s2);
    

    正如@user7在评论中建议的那样

        5
  •  0
  •   Lorelorelore R. Foxwood    6 年前

    == 比较对象引用,它检查两个操作数是否指向同一个对象(不是等效对象,而是 相同的 对象)。所以我真的认为唯一的办法就是这样:

    @Override
    public Student clone(){
        return this;
    }
    

    也许这会使 = 接线员按你的要求工作。这对我来说是非常错误的,因为我不认为这是 clone() 方法。否则,考虑到在班级工作的限制,我没有任何其他线索来说明如何按照你的要求行事。

    如果 克隆() 不能用也许答案会是:这是不可能的。

        6
  •  -3
  •   WizardNx    6 年前

    as==运算符比较对象引用,我认为s1和s2必须为空。