设置对象等于彼此(java)

Ida*_*ber 4 java methods compiler-errors equals

所以我有一个名为Person的类,看起来像这样

public class Person {

    private String personName;


    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

}
Run Code Online (Sandbox Code Playgroud)

和另一个我正在创建对象的类

public class IdanJavaTask {

    public static void main(String[] args) {

        Person p1 = new Person("Bob");
        System.out.println("p1 : " + p1);

        Person p2 = new Person("Joe");
        System.out.println("p2 :" + p2);

    }

}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好,我的打印声明是
p1:Bob
p2:Joe

现在我想创建一个新对象,p3并将其设置为p1,我的类现在看起来像这样:

public class IdanJavaTask {

    public static void main(String[] args) {

        Person p1 = new Person("Bob");
        System.out.println("p1 : " + p1);

        Person p2 = new Person("Joe");
        System.out.println("p2 :" + p2);

        Person p3 = new Person (p1);
        System.out.println("p3 equal to p1:" + p3.equals(p1));

    }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时,我收到以下错误消息:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The constructor Person(Person) is undefined

    at vehicleassignment.IdanJavaTask.main(IdanJavaTask.java:13)
Run Code Online (Sandbox Code Playgroud)

我想我需要在main(Person)类中添加一个方法,但我不知道为什么或要添加什么?为什么我不能把对象设置为彼此相等?

Msh*_*nik 9

有两种方法可以解释"将对象设置为彼此相等".

一个是你想要p1p3引用同一个对象.就像Clark Kent和Superman是同一个人的两个名字(参考)一样.这将通过以下方式实现:

Person p1 = new Person("Jim");
Person p3 = p1;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果发生任何事情p1,同样的事情发生了p3.如果你杀死克拉克肯特,你已经杀死了超人(因为他们是同一个人).Java确定与equals(Object o)方法的相等性- 两个对象a并且b等于iff a.equals(b)b.equals(a)返回true.使用相等的基本Object定义,这两个对象将是相同的,因此您不必担心这一点.

解释你的意思的另一种方法是创建一个新的人物对象,恰好是第一个人的精确副本.为了做到这一点,你必须在你的person类中添加另一个构造函数,该构造函数将一个人作为参数:

public class Person {

    private String personName;

    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

    public Person(Person personToCopy){
        this.personName = personToCopy.personName;
    }

}
Run Code Online (Sandbox Code Playgroud)

通过此设置,您可以执行主要操作.

Person p1 = new Person("Bob");
Person p3 = new Person(p1); //Will have name Bob.
Run Code Online (Sandbox Code Playgroud)

为了使p1p3平等的,我们要教Person类使用其字段检查平等.我们可以通过覆盖equals类人的方法来做到这一点.

public boolean equals(Object o){
    if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person

    Person p = (Person) o;
    return personName == null && p.personName == null || personName.equals(p.personName);
}
Run Code Online (Sandbox Code Playgroud)

每当我们覆盖该equals方法时,最好还要覆盖该hashcode方法,该方法int为每个Object 返回唯一的方法.由于Person对象具有的唯一字段是其名称,因此我们可以简单地使用该哈希码.

public int hashCode(){
    return personName == null ? 0 : personName.hashCode();
}
Run Code Online (Sandbox Code Playgroud)

总而言之,我们的Person类看起来像这样:

public class Person {

    private String personName;

    public String toString(){
        return personName;
    }

    public Person(String personName){
        this.personName = personName;
    }

    public Person(Person personToCopy){
        this.personName = personToCopy.personName;
    }

    public boolean equals(Object o){
        if(! (o instanceof Person)) return false; //a Person can't be equal to a non-person

        Person p = (Person) o;
        return personName == null && p.personName == null || personName.equals(p.personName);
    }

    public int hashCode(){
        return personName == null ? 0 : personName.hashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)