Object类
Object类时所有类的始祖,所有的类都是Object的子类。
我们可以使用Object类的对象变量引用任意类型的对象,并且
所有的数据类型均可扩展为Object类。
Object类的三个常用方法
1. equals方法
- 语法:对象1.equals(对象2);
- 功能:判断两个对象是否具有相同的引用(二者是否为同一对象)
- 返回值:boolean类型,相等返回true,否则返回false
在实际应用中常常需要在子类中重写equals方法,重新规定相等的标准,如在一个雇佣员工的类中,如果两个员工的id相同,名字相同,即可认定相等。
Java中要求子类重写的equals方法需满足:
- 自反性:对任意x != null,都有x.equals(x) == true
- 对称性:对任意x和y,x.equals(y) <=> y.equals(x)
- 传递性:对任意x,y,z,若x.equals(y)=true,y.equals(z)=true,则x.equals(z) = true
- 一致性:若x.equals(y) = true,则反复调用此语句结果不会变
- 对任意x != null,有x.equals(null) = false
重写equals需使用以下步骤:
- 显式参数命名为otherObject,并在稍后转换为other变量
- 直接使用==检测两个对象是否为同一引用
- 检测otherObject是否为null
- 检测二者的所属类名是否相等
- 将otherObject转换为相应的类变量
- 比较应该相等的实例域是否相等
public boolean equals(Object otherObject)
{
//直接检测二者是否相同
if(this == otherObject)
{
return true;
}
//检测比较对象是否为null
if(otherObject == null)
{
return false;
}
//检测是否为同一类
if(this.getClass() != otherObject.getClass())
{
return false;
}
//检测规定需要相等的实例域是否相等
Employee other = (Employee)otherObject;
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(id, other.id);
}
2. hashCode方法
- 语法:对象.hashCode();
- 功能:生成一个有对象导出的散列码(某一整数值)
- 返回值:int型数据,对象不同,则散列码不同(可以是负数)
由于hashCode定义在Object类中,所以每个对象都有一个默认的散列码,其值为该对象的存储地址
在自定义类中通常需要重写hashCode方法,目的是唯一地标识类中的对象
注:
- 在String类中的hashCode方法不是字符串的地址,而是根据字符串的内容生成散列码
所以两个String对象如果内容相同,则hashCode方法返回值相同 - StringBuilder类没有定义hashCode方法,因此其hashCode方法为Object类中的默认方法。所以两个StringBuilder对象的散列码是其存储地址,与内容无关
- hashCode方法的要求与equals相同:当x.equals(y)时,x.hashCode()和y.hashCode()必须相同
在自定义类中重写hashCode方法时,需注意对类中的每个实例域都生成默认的散列码并赋予权重,使该类生成的所有对象的散列码均匀分布
3. toString方法
- 语法:对象.toString()
- 功能:提供当对象以字符串形式输出时的值
- 返回值:String类型,返回一个表示该对象性质的字符串
绝大多数类的toString方法的返回值形式为:类名[域1=值,域2=值…]
自定义类为了更精确地表达对象的属性,需要重写toString方法,建议对每个自定义类都添加toString方法
重写toString方法尽量也遵守“类名[域值]”的格式
可以使用getClass().getName()方法获得类的具体名字(子类的话则会显示超类的名字和自己的名字)
设计子类的toString方法时,可以选择调用超类的toString方法,再加上自己独有的域值
注:
- 当一个对象和一个字符串通过 + 连接时,系统会自动调用对象.toString()
当字符串连接的是基本类型时,也会调用toString方法,将其内容转化为字符串 - 任意对象x,在调用println方法后,都会自动调用x.toString方法,输出对象所对应的字符串
System.out.println(x); //equals to System.out.println(x.toString());