您的位置:首页 > 移动开发 > Objective-C

Java中的Object-equals()方法

2017-12-02 22:50 239 查看
简单的说,这个类时所有类的始祖,就和C#一样,所有的类都是从这个类继承而来,而在C++没有这样的一个类。如果没有明确指出超类(就是父类,Java这么称呼吧,不太习惯),超类就是Object。

在Java中只有字符型,数值型和布尔型不是对象,其他都可以从Object继承而来。

首先,Object定义了一些基本的类方法,例如equals,toString简直和C#一样。还有hashCode方法。

equals方法在Object类中可以比较是否引用同一个对象,这样解释合情合理,只是对于大多数的类来说,直接使用真的有点鸡肋,所以我们需要重写这个类的实现。

下面是Object的equals的API,先了解下通用的equals:

(1)static boolean equals(Obicet,Object);

(2)static boolean equals(type[] a,type[] b);

第一个是之前说过的比较是否引用同一个对象,第二个是比较数组,如果数组的大小每个下标的值都相同的那么两个数组就相等(这个还是非常好用的)。

举例说明一下吧,比较两个雇员相等,我们从薪资,姓名id比较都相等的话就想等。

下面是我编写这样的一个equals。职工类和经理类,经理类继承与职工类。经理类比职工类多一个实例域奖金prizes。这样的话会编写一个子类的equals。

class Employee{
private String name;
private int id;
private double salary;
private static int nextId=1;
public Employee(String n,double sal) {
name=n;
salary=sal;
id=0;
}
public void setId() {
id=nextId;
nextId++;
}
public int getId() {
return id;
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
public static int getNextId() {
return nextId;
}
public boolean equals(Object other) {
if(this==other)//比较是否引用同一对象
return true;
if(other==null)
return false;
if(getClass()!=other.getClass())
return false;
Employee aother=(Manager)other;
return salary==aother.salary
&&id==aother.id
&&Object.equals(name,aother.name);

}
public static void main(String[] args) {
Employee e=new Employee("wudi",100000);
System.out.println(e.getName()+":"+e.getSalary());
System.out.println(nextId);//比较每一项的数据值,对象比较使用equals,数值比较使用==
}
}
class Manager extends Employee{
private double prizes;
public Manager(String aname,double asalary,double aprizes) {
super(aname, asalary);
prizes=aprizes;
}
public boolean equals(Object employee) {
if(!(super.equals(employee)))
return false;
Manager otherEmployee=(Manager)employee;
return prizes==otherEmployee.prizes;
}

}上面的getClass是返回对象的类,类似于C++的typeof吧。

编写一个完美的equals的建议:
1)显示的命名Obect,后面将转换它,特别容易忘记

2)检查this==other是否引用同一对象

3)检测other是否为空,为空的话不想等

4)比较this和other是否是同一个类的对象

在这里注意:如果每个子类都重新定义了equals的话使用getClass,所有子类都有统一的定义的话使用instanceof比较好。

这里如果子类没有改变的话可以这样写if(!(other instanceof Employee))return false;

5)把Obiect转换为对应的类,比如上面的Empolyee类对象,然后比较每一项的数据值,对象比较使用equals,数值比较使用==

子类改变的话调用super即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: