如果没有明确的指出超类,Object就被认为是这个类的超类。
Object类型的变量只能用于作为各种值的通用持有者。要相对其中的内容进行具体的操作,还需要清楚对象的原始类型,并进行相应的类型转换。
在Java中只有基本类型不是对象,如数值、字符和布尔。
5.2.1 equals方法
如果两个对象的状态都相等,就认为这两个对象是相等的。
子类定义equals方法时,先调用超类的equals。如果检测失败,对象就不可能相等。如果超类中的域都相等,就需要比较子类中的实例域。
Objects.equals(xx,yy);
5.2.2相等测试与继承
如何编写一个完美的 equals()方法的建议:
- 显式参数命名为otherObject,稍后需要将它转换为另一个叫做other的变量。
- 检测this与otherObject是否引用同一个对象。
if(this == otherObject) return true;
- 检测 otherObject是否为null,如果为null,则返回false。
if(otherObject == null) return false;
- 比较this与otherObject 是否属于同一个类。如果equals的语义在每个子类中有所改变,就是用getClass检测:
如果所有的子类都拥有统一的子类就使用instanceof检测:if(getClass() != otherObject.getClass()) return false;
if(!(otherObject instanceof ClassName)) return false;
- 将otherObject转换为响应的类类型变量。
ClassName other = (ClassName)otherObject;
- 比较域,使用 == 比较基本类型域,使用equals比较对象域。如果所有的域都匹配返回true,否则返回false。
如果在子类中重新定义了equals方法,就要在其中包含调用super.equals(this)。return field1 == other.field1 && Objects.equals(field2,other.field2);
对于数组使用Arrays.equals();
对于equals方法要求覆盖Object类的equals(Object others)方法。@Override
5.2.3 hashCode方法
散列码(hash code)是由对象导出的一个整型值;
字符串(String)的散列码是由内容导出的。StringBuffer类中没有定义hashCode方法,它的散列码由Object类默认hashCode方法导出的对象存储地址。
StringBuilder sb = new StringBuilder();
StringBuilder stringBuilder = sb;
System.out.println(stringBuilder.hashCode() +"\t" + sb.hashCode());
//引用同一个对象,hashCode相等。
Objects.hashCode(yy);
Objects.hashCode(name,salary,hireDay)
如果重新定义equals方法,就必须重新定义hashCode方法。
如果x.equals(y)返回true,那么x.hashCode()就必须与y.hashCode()具有相同的值。
5.2.4toString方法
通过getClass().getName()获取当前类的类名。
如果超类使用了getClass().getName(),那么子类只需要调用super.toString()就可以了。
public abstract class A {
private int id;
@Override
public String toString() {
return getClass().getName() + "[ id = " + id + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class B extends A{
private String name;
public B(){
}
public B(int id,String name){
this.name = name;
super.setId(id);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return super.toString() + "[name = " + name + "]";
}
}
B b = new B(2,"抱抱宝贝");
// A a = new A();
System.out.println(b.toString());
//输出
com.example.demo.entity.B[ id = 2][name = 抱抱宝贝]
只要对象与一个字符串通过操作符"+"连接起来,Java编译器就会自动调用toString()方法。
数组调用toString方法 Arrarys.toString(arrary);
int [] luckyNumber = {1,4,6,7,2};
System.out.println(String.valueOf(luckyNumber).toString());//错误
System.out.println(Arrays.toString(luckyNumber));//正确
toString() 非常有用的调试工具。