如何更改Student类,以便当s1 = new Student()和s2 = new Student()时,s1 == s2返回true?

时间:2018-05-31 13:13:08

标签: java

在我的一次采访中,一位采访者问我:

给定Student类和两个对象s1s2

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

s1 == s2将如何返回true

我告诉他让Student班级成为单身人士,但他说不,而且我们必须在班级进行更改,以便s1 == s2返回true。< / p>

注意:我们需要更改Student课程。请不要回复s1=s2。 任何线索?

6 个答案:

答案 0 :(得分:5)

操作符s1 == s2检查两个对象是否相同。 您创建了两个不同的equals对象。 所以它们不一样,equals将返回false。 您必须重新定义方法s1.equals(s2) 并使用此方法检查它们,如下所示:

==

方法equals

  

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

请注意,当您重新定义方法equals时,您还需要重新定义方法hashCode,如在equals方法的描述中明确记录的那样:

  

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。

通常ide(如IntelliJ,Eclipse或Netbeans)可以帮助您编写两种方法的良好实现。

考虑到这一点,我想面试官已经问过像 s1将s2等于s2 这样的话,而你误解了它是 s1(simble equals)s2 。或者他已经在论文中明确写了运算符s1 == s2 // returns true

如果面试官明确询问将如何

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

创建两个对象后

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

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

null

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

您可以有一个类似的行为,分配给先前创建的变量Student或其他s1。基本上,对s2分配给function getAppNames(){ var appRef = firebase.database().ref().child('ApplicationList'); var allApps = {}, appNames =[]; let temp = {}; appRef.on('value', function(snap) { allApps = {}; appNames = []; allApps = snap.val(); console.log('allApps', allApps); let keys = Object.keys(allApps); console.log('Keys = ',keys); for(let i=0;i<keys.length;i++){ temp = {}; temp['shortName'] = allApps[keys[i]].shortName; temp['longName'] = allApps[keys[i]].longName; appNames[i] = temp; } appNames['appNames'] = appNames; console.log('appNames = ',JSON.stringify(appNames)); var source = document.getElementById("sidebar-template").innerHTML; var template = Handlebars.compile(source); $('.content-placeholder').html(template(appNames)); }); } 的代码的任何更改都将有效。

答案 1 :(得分:3)

这是一种技巧,但会满足要求:

更改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,因为s1s2都是null

即使我们没有捕获异常,s1 == s2在两个构造函数调用之后仍然是真的(实际上在第一个构造函数调用之后,因为第二个构造函数将永远不会被执行),但是我们有在某个地方捕获异常以便测试它。

答案 2 :(得分:2)

已经回答here==比较了参考。即它比较s1s2是否指向同一个对象。由于您使用new来实例化s1s2,因此您的要求只是不可能

答案 3 :(得分:1)

我看到的唯一合乎逻辑的解决方案是微不足道的:

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在评论中建议

答案 4 :(得分:0)

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

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

也许这会让==运算符按照您的要求运行。这对我来说是非常错误的,因为我不认为这是clone()方法的预期用途。否则,当你考虑到在班级工作的约束时,我没有任何关于如何制作的线索。

如果clone()无法使用,答案可能是:无法做到这一点。

答案 5 :(得分:-3)

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