Object类
引入
1. 包:java.lang.Object
2. Object类是Java中的祖宗类。
3. 一个类要么默认继承了Object类,要么间接继承了Object类。
4. Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。Object类的常用方法:
public String toString():
– 默认是返回当前对象在堆内存中的地址信息:
com.itheima._12Object类的详细使用.Student@735b478
– 默认的地址信息格式:类的全限名@内存地址
– 直接输出对象名称,默认会自动调用toString()方法,所以输出对象toString()调用可以省略不写
– 开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息!
所以父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息输出!!
小结:
toString()默认是返回当前对象在堆内存中的地址信息:
开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息!
所以父类toString()方法存在的意义就是为了被子类重写,重写toString可以看到对象的内容信息。public boolean equals(Object o):
toString
默认返回地址信息,代码如下
public class ObjectToStringDemo01 {
public static void main(String[] args) {
Student zs = new Student("张森",21 , '男');
// 直接调用toString方法返回的是对象在内存重点的地址
// System.out.println(zs.toString());
// 直接输出对象名称,默认会自动调用toString()方法,所以输出对象toString()调用可以省略不写
System.out.println(zs);
}
}
打印结果:
而这样是毫无意义的,存在的价值就是重写后然后返回对象内容信息
public String toString() {
return "_object01{name = " + name + ", age = " + age + ", sex = " + sex + "}";
}
结果:
equals
(2)public boolean equals(Object o):
– 默认是比较两个对象的地址是否相同。相同返回true,反之。
– 直接比较两个对象的地址是否相同完全可以用“==”替代equals。
所以equals存在的意义是为了被子类重写,以便程序员可以
自己来定制比较规则。
– 需求:只要两个对象的内容一样,我们就认为他们是相等的。
小结:
equals存在的意义是为了被子类重写,以便程序员可以
自己来定制比较规则。
重写equals,定义比较内容!!!!
public class _equals01 {
public static void main(String[] args){
students st1 = students.createst();
students st2 = students.createst();
System.out.println(st1.equals(st2));
}
public static class students{
private String name;
private int age;
private char sex;
public students(String name,int age,char sex){
this.age = age;
this.sex = sex;
this.name = name;
}
@Override
public boolean equals(Object obj){
if(obj instanceof students){
//如果是学生类型 强转成学生对象
students st2 = (students) obj;
return this.name.equals(st2.name) && this.age == st2.age
&& this.sex == st2.sex;
}else return false;
}
public static students createst(){
return new students("沐鑫",22,'男');
}
}
}
官方提供的重写方法!!更高效,更周到,更安全!!
@Override
public boolean equals(Object o) {
// 1.判断是否自己和自己比较,如果是同一个对象比较直接返回true
if (this == o) return true;
// 2.判断被比较者是否为null ,以及是否是学生类型。
if (o == null || this.getClass() != o.getClass()) return false;
// 3.o一定是学生类型,强制转换成学生,开始比较内容!
Student student = (Student) o;
return age == student.age &&
sex == student.sex &&
Objects.equals(name, student.name);
}
Objects
Objects类与Object还是继承关系。
Objects类是从JDK 1.7开始之后才有的。Objects的方法:
- public static boolean equals(Object a, Object b)
– 比较两个对象的。
– 底层进行非空判断,从而可以避免空指针异常。更安全!!推荐使用!!
public static boolean equals(Object a, Object b) {
return a == b || a != null && a.equals(b);
}- public static boolean isNull(Object obj)
– 判断变量是否为null ,为null返回true ,反之!
public class _Objects01 {
public static void main(String[] args){
_student st1 = null;
_student st2 = new _student();
System.out.println(Objects.equals(st1,st2));
System.out.println(st1.equals(st2));
}
}
运行结果:显然Objects类引用的报了空值异常的错误!!!更安全!!!