Object类的作用
- 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
- Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。
toString方法
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
- 开发中直接输出对象,默认输出对象的地址其实是毫无意义的
- 开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息
例如:Student类中有name、sex、age成员变量,则重写toString方法为:
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
toString存在的意义
- 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!!
equals方法
方法名 | 说明 |
---|---|
public boolean equals(Object o) | 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!! |
- 直接比较两个对象的地址是否相同完全可以用 “ == ” 替代equals。
- 父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则。
例如:Student类中有name、sex、age成员变量,则重写equals方法为:
@Override
public boolean equals(Object o){
if (o instanceof Student){ //判断真实类型是否为Student
Student s = (Student) o; //强转成Student类型便于后续调用成员变量
if (this == s) //地址相同一定相同
return true;
else if (this.name.equals(s.name) && this.sex.equals(s.sex) && this.age == s.age)//成员变量值要都相同
return true;
else
return false;
}
else
return false;
}
//简化写法
@Override
public boolean equals(Object o){
if (o instanceof Student){
Student s = (Student) o;
return this.name.equals(s.name) && this.sex.equals(s.sex) && this.age == s.age;
}else
return false;
}
//官方写法
@Override
public boolean equals(Object o) {
if (this == o) return true; //地址相同
if (o == null || getClass() != o.getClass()) return false; //地址为空或者二者真实类型不同
Student student = (Student) o; //强转
return age == student.age && Objects.equals(name, student.name) && Objects.equals(sex, student.sex);
}
Objects
- Objects类与object还是继承关系,Objects类是从JDK1.7开始之后才有的
官方在进行字符串比较时,没有对象自己的equals方法,而是选择了0bjects的equals方法来比较两个对象。
@Override
public boolean equals(Object o){
//1.判断是否是同一个对象比较,如果是返回true
if (this == o) return true;
//2.如果o是null返回false 如果o不是学生类型返回false ...Student != ...Pig
if (o == null || this.getClass() != o.getClass()) return false;
//3.说明o一定是学生类型而且不为null
Student student = (Student) o;
return sex == student.sex && age == student.age && Objects.equals(name, student.name);
}
Objects的equals方法比较的结果是一样的,但是更安全
//官方源码
public static boolean equals(Object a, Object b){
//先做了非空校验,避免空指针异常,所以更安全
return (a == b) || (a != null && a.equals(b)); //先判断a和b的地址是否相同,不相同则判断a是否为空,不为空之后再和b比较地址
}
Objects的常见方法
方法名 | 说明 |
---|---|
public static boolean equals(Object a, Object b) | 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较 |
public static boolean isNull(Object obj) | 判断变量是否为null ,为null返回true ,反之 |
public static boolean isNull(Object obj){
return obj == null;
}