Object类,及其常用的方法的覆盖重写(toString,equals)
Object类
类Object是类层次结构的根(最顶层)类。每个类都使用了Object类作为父类。所有对象(包括数组)都实现这个类的方法。
toString()方法
- 作用:打印对象的信息
- 重写前:打印的是包名类名@地址值
- 重写后:打印的是对象中的属性值
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
类ArrayList、类Scanner中覆盖重写了toString方法,所以,它调用toString时,才能直接打印出字符串。
类Random没有覆盖重写toString方法,所以它调用toString时,打印的是地址值。
equals()方法
作用:比较两个对象
重写前:比较的是对象的地址值
重写后:比较的是对象中的属性值
==:比较运算符
基本数据类型:比较的是值。
引用数据类型(类):比较的是两个对象的地址值。
但由于equals()方法中传递的参数是Object型的,相当于向上转型了,就存在这样的一个问题:多态中,多态定义的父类对象无法使用子类特有的属性/方法。所以需要对Object进行向下转型。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//getClass() != o.getClass()使用反射技术,判断o是否为子类型 等效于 instanceof
Objects类中的equals()方法
Objects的方法不会抛出空指针异常,加了一些健壮性的判断。
boolean flag=Objects.equals(s1,s2);//不会异常
String s1=null;
String s2="abc";
boolean b=s1.equals(s2);//NullPointerException null是不能调用方法的,会抛出空指针异常