覆盖/重写Object类中equals方法

我们在写程序时,往往有时Java类库中的equals方法不能满足我们的需求。这时,就需要我们自己来定义equals方法。

在写自定义equals方法之前,我满先来看两个类库中已经写好的equals方法。

一、Object.equals()

很简单的一个方法,因为是Object的方法,所以对所有对象都适用。

public boolean equals(Object obj) {
        return (this == obj);
    }

二、String.equals()

private final char value[];

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

我们来看String类重写equals方法时,都做了些什么。

首先是判断是不是自己,如果是自己好办,直接返回true就完事了。

然后如果不是自己,先看看传入的参数是否为String类型,不是返回false就完事。

再然后都是String类型了,在比较长度是否相等,每个字符的值是否相等,全都相等就返回true。

三、自定义equals()

通过模仿String.equals(),我们来写Person.equals()。

class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public boolean equals(Object another) {

        //先判断是不是自己,提高运行效率
		if (this == another)
			return true;

        //再判断是不是Person类,提高代码的健壮性
		if (another instanceof Person) {

            //向下转型,父类无法调用子类的成员和方法
			Person anotherPerson = (Person) another;

            //最后判断类的所有属性是否相等,其中String类型和Object类型可以用相应的equals()来判断
			if ((this.getName().equals(anotherPerson.getName())) && (this.getAge() == anotherPerson.getAge()))
				return true;
		} else {
			return false;
		}

		return false;
	}
}


}

在覆盖equals()时,我们在自定义equals内部调用了Object.equals()和String.equals()。

 

四、自动生成的equals()

考虑到实际中我们可能会经常覆写equals(),因此eclipse为我们提供自动生成的equals()。

操作过程如上图所示,读者可自行操作查看自动生成的代码。

猜你喜欢

转载自blog.csdn.net/skisqibao/article/details/81157745