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.员工类
2.经理类(继承员工)
3.测试类
自反性、对称性、传递性、一致性并且对于任意的非空引用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 lijtaos@sina.com
*@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);
}
}