如何重写equals和tostring方法

时间:2013-03-28 02:49:47

标签: java

我正在试图弄清楚它是如何工作的。我认为这些方法存储在java.lang.Object中,但我无法弄清楚如何在代码中覆盖它们。这是我设计的一个小程序来测试我的理解(这是不对的)。

AddressTester:

import java.util.ArrayList;
import java.util.Scanner;

public class AddressTester
{

    public static void main(String[] args)
    {

        Address home = new Address("123 Loving Fat Girl ln", "Dollywood", "NY",
                "98765");

        Scanner in = new Scanner(System.in);

        System.out.println("-- Enter your home address --");
        System.out.println("123 Loving Fat Girl ln, Dollywood, NY, 98765");

        System.out.print("Enter the street address: ");
        String addr = in.nextLine();

        System.out.print("Enter the city: ");
        String city = in.next();

        System.out.print("Enter the state: ");
        String state = in.next();

        System.out.print("Enter the zipcode: ");
        String zipcode = in.next();

        Address enteredAddress = new Address(addr, city, state, zipcode);

        System.out.println(enteredAddress);

        if (home.equals(enteredAddress))
        {
            System.out.println("You are correct!");
        }
        else
        {
            System.out.println("You are incorrect!");
        }

        ArrayList<Address> addresses = new ArrayList<Address>();
        addresses.add(home);

        if (addresses.contains(enteredAddress))
        {
            System.out.println("The address wasn't found");
        }
        else
        {
            System.out.println("The address was found");
        }

    }

}

地址:

public class Address
{
    private String address;
    private String city;
    private String state;
    private String zipcode;


    public Address(String address, String city, String state, String zipcode)
    {
        this.address = address;
        this.city = city;
        this.state = state;
        this.zipcode = zipcode;

    }

    public boolean equals(Object otherObject)
    {
        if(otherObject == this)
        {
            return true;
        }
        if(otherObject != this)
        {
            return false;
        }
        return true;
    }

    public String getAddress()
    {
        return address;
    }

    public void setAddress(String addr)
    {
        this.address = addr;
    }

    public String getCity()
    {
        return city;
    }

    public void setCity(String city)
    {
        this.city = city;
    }

    public String getState()
    {
        return state;
    }

    public void setState(String state)
    {
        this.state = state;
    }

    public String getZipcode()
    {
        return zipcode;
    }

    public void setZipcode(String zipcode)
    {
        this.zipcode = zipcode;
    }

}

4 个答案:

答案 0 :(得分:1)

你只是在检查身​​份,这不是你想要的。 看看这个关于实现equals()的好reference:正如他们提到的那样

  

equals通常应该比较状态,而不是身份。这是   对于映射到数据库的“以数据为中心”的类尤其如此   记录。

答案 1 :(得分:1)

在这个例子中,我重写了hashCode,toString和equals。我的标准是equals应该使用someClass的someAttribute来定义所述类实例之间的de equals()。 HashCode应该以相同的方式与equals一起重新定义。

@Override
public String toString() {
     return "SomeClass [attribute=" + someAttribute + "]";
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + someAttribute;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (obj == null)
        return false;       
    if (this == obj)
        return true;

    if (getClass() != obj.getClass())
        return false;
    SomeClass other = (SomeClass) obj;
    if (someAttribute != other.someAttribute)
        return false;
    return true;
}

答案 2 :(得分:0)

这种问题已被无数次回答。

如果您使用的是Eclipse IDE,它默认为您提供生成,equals,hashCode和toString函数的功能。

你也必须在equals方法中使用某种类变量进行比较。

请做一个谷歌搜索被这个主题的无数结果所震撼

答案 3 :(得分:0)

==运算符在应用于Object的实例时,会检查是否在对{{1}的同一实例的两次引用之间进行了比较}。如果使用相同的地址,城市,州和邮政编码创建了Object的两个实例,Address运算符在用于比较这两个不同的实例时将返回==。您需要使用函数覆盖false上的equals(),以明确检查4个字段中的每个字段是否匹配,并在这种情况下返回Address

构建一个声音true覆盖实现是很难的,你应该检查其他海报提供的链接。