Object是所有类的始祖,java中的每个类的都是它拓展而来的。
Object的euqals方法、hashCode方法、getClass方法和toString方法在操作对象时是非常有用的方法。
1.euqals方法
euqals方法用于检测一个对象是否等于另外一个对象(两个对象是否指向同一块存储区域),java语言规范要求euqals方法具有以下特性:
自反性、对称性、传递性、一致性并且对于任意的非空引用x,x.equals(null)应返回false.
java7在java.util包下新增了Objects工具类,用于操作对象,下面是其原版API的介绍:
public final class Objects extends Object
This class consists of static utility methods for operating on objects.
These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, and comparing two objects. Since: 1.7
2.hashCode方法
hashCode(散列码)是由对象导出的一个整型值,没有规律。
特别注意euqals方法和hashCode方法必须一致,如果x.euqals(y)返回true,那么x.hashCode()=y.hashCode()
3.toString方法
toString方法用于返回表示对象的字符串。
如果要打印多维数组,需要调用java.util.Arrays.deepToString()方法。java.util包下从jdk1.2开始增加的Arrays工具类,包含了大量操作数组的有用的方法,它也重写了Object的很多方法,用于操作对象。
4.getClass方法
返回包含对象信息的类对象,java提供了类运行时的描述,它的内容被封装在java.lang.Class类中。
java.lang.Class类的方法:
String getName() ---- 返回这个类的名字
Class getSuperClass() ---- 以Class对象的形式返回这个类的超类信息
下面是一个完整的实例,以一个员工类的例子演示了这几个方法的应用(请于不低于JDK1.7环境编译运行):
1.员工类
/** *员工类 */ import java.util.Date; import java.util.GregorianCalendar; import java.util.Objects; public class Employee { /** *@param name 员工姓名 *@param salary 员工工资 *@param hireDate 雇用日期 */ private String name; private double salary; private Date hireDay; /** *构造方法 初始化员工类的字段 */ public Employee(String n,double s,int year,int month,int day) { name=n; salary=s; GregorianCalendar calendar=new GregorianCalendar(year,month-1,day); hireDay=calendar.getTime(); } /** *私有字段访问器 */ public String getDate() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } /** *涨工资的方法 */ public void raiseSalary(double byPercent) { double raise=salary*byPercent/100; salary+=raise; } /** *重写euqals方法、hashCode方法和toString方法 */ @Override public boolean equals(Object obj) { if(this==obj) return true; if(obj==null) return false; if(getClass()!=obj.getClass()) return false; Employee other=(Employee)obj; return Objects.equals(name,other.name)&&salary==other.salary&&Objects.equals(hireDay,other.hireDay); } @Override public int hashCode() { return Objects.hash(name,salary,hireDay); } @Override public String toString() { return "\t"+getClass().getName()+"\t员工姓名:\t"+name+"\t员工工资:\t"+salary+"\t雇用日期:\t"+hireDay; } }
2.经理类(继承员工)
/** *经理类 增加了奖金字段 */ public class Manager extends Employee { private double bonus; public Manager(String n,double s,int year,int month,int day) { super(n,s,year,month,day); bonus=0; } //设置奖金的方法 public void setBonus(double b) { bonus=b; } /** *重写Employee的getSalary、equals和方法 **/ @Override public double getSalary() { double base=super.getSalary(); return base+bonus; } @Override public boolean equals(Object obj) { if(!super.equals(obj)) return false; Manager other=(Manager)obj; return other.bonus==bonus; } @Override public String toString() { return super.toString()+"\t经理奖金:\t"+bonus; } }
3.测试类
//测试类 /** *@author [email protected] *@version 1.0 2015-04-17 **/ public class Test { public static void main(String[] args) { Employee tom=new Employee("Tom",7500,2010,3,15); Employee tom1=tom; Employee tom2=new Employee("Tom",7500,2010,3,15); tom1.raiseSalary(15); Manager bob=new Manager("Bob",10000,2010,3,15); bob.raiseSalary(10); bob.setBonus(25000); System.out.println("tom==tom1:\t"+(tom.equals(tom1))); System.out.println("tom==tom2:\t"+(tom.equals(tom2))); System.out.println("bob=======\t"+bob); System.out.println("tom=======\t"+tom); System.out.println("tom1======\t"+tom1); System.out.println("tom2======\t"+tom2); } }