Java 什么是使用对象作为参数的构造函数?
我有下面的代码,因为我知道它应该返回像Java 什么是使用对象作为参数的构造函数?,java,class,Java,Class,我有下面的代码,因为我知道它应该返回像TRUE&FALSE这样的输出,但不幸的是,当我运行这个程序时,它返回的输出像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) {
TRUE
&FALSE
这样的输出,但不幸的是,当我运行这个程序时,它返回的输出像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
obj1.equals(obj2)
=
,而不是equals()
。假设您实现了equals()
,则问题中的示例输入将打印true
和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 :)
}
要测试两个对象是否相同(即:它们是否是一个相同的对象),请使用
=
,而不是equals()
。假设您实现了equals()
,则问题中的示例输入将打印true
和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 :)
}
首先,你调用的是equals to函数,而不是check函数。所以你可以改变它。或者你可以把check改为equals,然后覆盖equals to对象
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));
}
首先,你调用的是equals to函数,而不是check函数。所以你可以改变它。或者你可以把check改为equals,然后覆盖equals to对象
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));
}
您必须重写equals方法而不是check方法…对象类上不存在check方法 请注意:如果重写equals,Java的规范也需要重写hashCode方法
或者,您可以使用自己的check。您必须重写equals方法而不是check方法……对象类上不存在check方法 请注意:如果重写equals,Java的规范也需要重写hashCode方法
或者,您可以使用自己的检查。为什么您认为它应该返回False和True?它应该是
System.out.println(obj1.check(obj2));
您没有重写equals,但创建了一个名为check的新方法。为什么您希望obj1.equals(obj2)
调用检查(Test)
method?@SotiriosDelimanolis因为obj1
的值被设置为构造函数,同样地obj2
的值也被设置为构造函数,因为在第一次比较中,它们都是相同的,所以我认为对于这个比较obj1.equals(obj2)应该返回true
为Test
类实现的equals
方法在哪里?它实际上在哪里检查对象是否相等?为什么您认为它应该返回False和True?它应该是System.out.println(obj1.check(obj2))
您没有重写equals,而是创建了一个名为check的新方法。为什么希望obj1.equals(obj2)
调用check(Test)
method?@SotiriosDelimanolis因为obj1
的值被设置为构造函数,同样地obj2
的值也被设置为构造函数,因为在第一次比较中,它们都是相同的,所以我认为对于这个比较obj1.equals(obj2)应该返回true
为Test
类实现的equals
方法在哪里?它实际上在哪里检查对象是否相等?==
检查两个对象是否相同。Word“相同“恐怕这很容易引起误解。@尼古拉正确的技术术语是:==
测试参考身份。因此,可以正确地说,==
测试两个对象是否相同identical@SotiriosDelimanolis没错。我在回答中添加了一个实现,谢谢@rani好的,可以随意问你需要的任何问题:)看起来你对java非常了解。你能告诉我你是如何学习java的吗?我应该做什么并遵循什么来学习java?6个月以来我一直在找工作,每次我去面试他们都会拒绝我。所以我想学得快。==
检查两个对象是否是同一个对象。“完全相同”这个词恐怕很容易引起误解。@Nikolay正确的技术术语是:=
测试参考身份。因此,可以正确地说,==
测试两个对象是否相同identical@SotiriosDelimanolis没错。我在回答中添加了一个实现,谢谢@rani好的,可以随意问你需要的任何问题:)看起来你对java非常了解。你能告诉我你是如何学习java的吗?我应该做什么并遵循什么来学习java?6个月以来我一直在找工作,每次我去面试他们都会拒绝我。所以我想快点学。