我有以下代码,据我所知它应该返回像TRUE
& FALSE
但不幸的是,当我运行此程序时,其返回的输出ike False
& False
输出。为什么呢?
请解释一下这个程序的含义,帮助我。
//How to pass objects as parameter in constructor
package learn.basic.corejava;
public class Test {
int a,b;
public Test(int i,int j) {
a=i;
b=j;
}
boolean check(Test tobj)
{
if(tobj.a == a && tobj.b == b)
{
return true;
}
else
{
return false;
}
}
public static void main(String[] args) {
Test obj1=new Test(100, 22);
Test obj2=new Test(100, 22);
Test obj3=new Test(-1, -1);
System.out.println(obj1.equals(obj2));
System.out.println(obj1.equals(obj3));
}
}
为什么我认为“它应该返回True
& False
obj1
的值设置为构造函数&类似地,obj2
的值也设置为构造函数,因为在第一次比较中它们都是相同的,所以我认为它应该返回true
进行此比较obj1.equals(obj2)
答案 0 :(得分:3)
要测试两个对象是否相同(即:它们是否相同),请使用==
,而不是equals()
。通过问题中的示例输入,这将打印true
和false
,假设您已实施equals()
:
System.out.println(obj1.equals(obj2)); // true
System.out.println(obj1 == obj2); // false
或许更有趣:
Test obj1 = new Test(100, 22);
Test obj2 = new Test(100, 22);
Test obj3 = obj2;
System.out.println(obj1.equals(obj2)); // true
System.out.println(obj1 == obj2); // false
System.out.println(obj2 == obj3); // true
System.out.println(obj1.equals(obj3)); // true
现在回到你的问题。问题在于你没有正确实现equals()
,它测试对象之间的值相等,这就是你感兴趣的内容。对于问题中的代码, equals()
的正确实现如下所示:
@Override
public boolean equals(Object obj) {
if (this == obj) // are the objects identical?
return true;
if (obj == null) // is the other object null?
return false;
if (getClass() != obj.getClass()) // do the objects have the same class?
return false;
Test other = (Test) obj; // cast other object
if (a != other.a) // is the `a` field equal in both objects?
return false;
if (b != other.b) // is the `b` field equal in both objects?
return false;
return true; // ok, the objects are equal :)
}
答案 1 :(得分:1)
首先,你要调用等于函数而不是check函数。所以你可以改变它。或者您可以将检查更改为等于并覆盖对象等于。
public static void main(String[] args) {
Test obj1=new Test(100, 22);
Test obj2=new Test(100, 22);
Test obj3=new Test(-1, -1);
System.out.println(obj1.check(obj2));
System.out.println(obj1.check(obj3));
}
答案 2 :(得分:0)
您必须覆盖equals方法而不是check方法...对象类
上不存在检查方法http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
请注意:如果覆盖等于Java的规范,则需要覆盖hashCode方法。
您也可以使用自己的支票。