Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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 什么是使用对象作为参数的构造函数?_Java_Class - Fatal编程技术网

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个月以来我一直在找工作,每次我去面试他们都会拒绝我。所以我想快点学。