Java 如何更改Student类,使s1==s2在s1=new Student()和s2=new Student()时返回true?
在我的一次采访中,一位采访者问我: 给定一个Java 如何更改Student类,使s1==s2在s1=new Student()和s2=new Student()时返回true?,java,Java,在我的一次采访中,一位采访者问我: 给定一个Student类和两个对象s1和s2: s1 = new Student(); s2 = new Student(); s1==s2如何返回true 我告诉他让Student班级成为一个单身学生,但他说不,我们必须改变班级级别,以便s1==s2返回true 注意:我们需要更改学生课程。请不要回复s1=s2。 有线索吗?操作员检查两个对象是否相同。 您创建了两个不同的equals对象。 因此它们不相同,s1==s2将返回false。 您必须重新定义方法
Student
类和两个对象s1
和s2
:
s1 = new Student();
s2 = new Student();
s1==s2
如何返回true
我告诉他让Student
班级成为一个单身学生,但他说不,我们必须改变班级级别,以便s1==s2
返回true
注意:我们需要更改学生
课程。请不要回复s1=s2
。
有线索吗?操作员检查两个对象是否相同。 您创建了两个不同的equals对象。 因此它们不相同,
s1==s2
将返回false。
您必须重新定义方法equals
,并使用此方法检查它们,如下所示:
s1.equals(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
方法:
指示其他对象是否与此对象“相等”
请注意,当您重新定义方法equals时,还需要重新定义方法hashCode,正如equals方法说明中明确说明的:
请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码
通常,ide(如IntelliJ、Eclipse或Netbeans)可以帮助您编写这两种方法的良好实现
考虑到这一点,我想面试官问了一些问题,比如s1如何等于s2谈论它,而你误解为s1(simble等于)s2如何。或者他在纸上明确地写下了操作符=
如果面试官明确地问到如何
s1 == s2 // returns true
将两个对象创建为
Student s1 = new Student();
Student s2 = new Student();
唯一的可能性是改变s1(或s2)的参考,如下所示:
s1.equals(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
的相同引用的代码所做的任何更改都将起作用。当==运算符比较对象引用时,我认为s1和s2必须为空。=
比较对象引用,它检查两个操作数是否指向同一对象(不是等价的对象,相同的对象)。所以我真的认为唯一的方法是这样的:
@Override
public Student clone(){
return this;
}
也许这会使=
操作符按照您的要求工作。这对我来说是非常错误的,因为我不认为这是clone()
方法的预期用途。否则,考虑到在类级别工作的限制,我没有任何其他线索可以按照您的要求进行操作
如果不能使用
clone()
,答案可能是:这是不可能的。我看到的唯一逻辑解决方案是微不足道的:
s1 = new Student();
s2 = new Student();
s1=null;
s2=null;
System.out.println(s1==s2);
或:
或:
正如@user7在评论中所建议的,正如已经回答的,
=
比较了引用。也就是说,它比较了s1
和s2
是否指向同一个对象。由于您使用new
来实例化s1
和s2
,因此您的需求是不可能的是一种技巧,但将满足以下要求:
更改Student
构造函数以引发一些异常(我选择了一个未经检查的异常,因此不必在throws子句中指定它):
现在,假设允许我们添加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
在两个构造函数调用之后仍然为真(实际上是在第一个构造函数调用之后,因为第二个构造函数调用永远不会执行),但我们必须在某个地方捕获异常才能对其进行测试。覆盖equals
和hashcode
?您确定,他说的是==和非equals Java不允许运算符重载,例如==。您可以做的最接近的事情是提供一个.equals()
进行比较。==的实现是引用相等,这只适用于指向内存中同一对象的变量。@HemantPatel是的,它显然是'=='。然后答案是:在构造函数中没有任何东西可以使s1==s2
之后。我想每个人都认为它是'equals',但它是很明显,“==”可能是你的面试官想问关于平等的问题()但是犯了一个错误。不要对面试问题只给出简短的文字回答。把它作为一个机会来解释你所知道的,你的推理和解决问题的能力。是的,它是==这就是为什么我回答Singleton,但他想让我在学生课堂上进行更改。你不能使用new运算符创建对象实例并检查==在不同的实例上返回true简单地说,如果在类上使用new,则会导致堆上的对象构造。如果我们使用==比较两个引用,这就像比较堆上的两个不同内存位置。它必须明确返回false。单例通常使构造函数私有,并公开构造方法,该方法在每次调用时返回相同的对象引用(如果已创建一次)。s1=new Student();
不能导致s1
为null
。是的,但这是获得预期响应的唯一方法no,s1=s2;
是另一个选项。即使这样,你也需要详细说明你的答案+推理。迪帕克·蒂瓦里说s1=s2不是一个选项:-)好的,我不会再争辩了:这个答案不好,我的反对票将留在这里。或者s1=s2
或者s2=s1<
Student s1 = null;
Student s2 = null;
try {
s1 = new Student();
s2 = new Student();
}
catch (Exception e) {
}
System.out.println (s1==s2);