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即可。
在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即可。
相关文章推荐
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- 多态Object类equals方法学习笔记ObjectDemo.java
- JAVA基础知识回顾(基本数据类型,switch参数,equals与==的区别,Object有哪些公用方法)-1
- Java Object equals方法
- java超类Object的equals()方法
- java基础:Object的equals方法
- java 的Object的equals方法
- Java中重写object下的equals方法
- Java记录 -57- Object的equals、hashcode和toString方法
- JAVA源码分析之---Object类(二)---hashCode,equals,clone方法的使用
- [Java] Object方法浅析(一): equals与hashCode
- Effective Java Item8-在覆盖equals(Object类的nonfinal方法)时遵循接口规范
- Java--Object中的equals方法的几个要点
- 重写Java Object对象的hashCode和equals方法实现集合元素按内容判重
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解
- java Object对象中hashCode和equals方法学习
- JAVA初学之Object类之toString方法、equals方法
- java小记之Object类的equals方法t
- java Object 的equals方法的复写
- Java记录 -57- Object的equals、hashcode和toString方法