Object的描述
Object类是类层次结构的根,每个类都有Object类作为超类,所有对象(包括数组)都实现了这个类的方法
Object类的toString方法
toString源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
我们可以重写同String方法 创建一个Student类
public class Student {
public String name;
public int age;
public class ObjectDemo {
public static void main(String[] args) {
Student student=new Student();
System.out.println(student.toString());
}
}
运行Object类,结果如下
在原来的Student类添加同String方法
Object类的equals方法
public class ObjectDemo {
public static void main(String[] args) {
Student student=new Student();
System.out.println(student.toString());
Student student1=new Student();
System.out.println(student==student1);
}
}
运行后结果是false还是true? 但是改为,结果仍为false
System.out.println(student.equals(student1));
查看equals源码
public boolean equals(Object obj) {
return (this == obj);
}
可以发现此时就是==,所以仍然需要重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
在运行就是true PS:最近发现一个关于toString()方法的问题 我在打印出把.toString()方法去掉,但结果仍然能打印出.toString()方法, 例如:
System.out.println(student);
查看源码也没有显示有显示调用的情况啊,这是为什么了? 然后查《Java核心密卷一》P182页只有如此简短一句话。 如果x是一个任意的对象,并调用 System.out.println(x); println方法就会简单的调用,并打印输出得到字符串。 但问题是编译器为什么要调用了?
当一个Object实例被转化成String时,Java就会自动调用toString()方法返回一个String。 System.out.println标准输出,只能输出String,所以,所有需要输出的Object都会被转化成String。如果你没有覆盖toString,那么,Java会自动调用最上层父类Object的toString()方法。 其内容如下: return getClass().getName() + “@” + Integer.toHexString(hashCode()); 所以,没有定义toString,并用System.out.println输出实例的时候,会看到类名和哈希码。当你覆盖了toString()后,会调用你自己写的toString()方法。 所以在System.out.println(x);能不写toString方法就不写,因为如果对象是null,自作聪明去显示调toString()方法就会报空指针异常System.out.println(Object str)这个方法遇到null对象,会打印null,不会再去调toString()方法。
|