Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改Student类,使s1==s2在s1=new Student()和s2=new Student()时返回true?_Java - Fatal编程技术网

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);