Object类:所有类的祖先,其余类均为Object的子类,Java中的任何对象一定是Object类的对象。
其他都都直接或间接继承了Object类。
Object类中的方法
1、toString方法
源码:
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
备注:
getClass():返回的是一个Class类的对象,Class类:任何一个.class文件都是Class类的一个对象。
getName():Class类的方法,获取一个类的全类名(包名.类名),例如:java.lang.String
测试:打印Student对象(默认调用toString方法),结果:com.test01.Student@1b6d3586
此结果输出的信息,没有任何价值。我们需要重写该方法。
重写的目标:输出该对象的属性值。
注意:一般用于测试,测试成功后,可以不必重写toString方法
2、hashCode()方法:
源码:public native int hashCode();
作用:返回一个对象的哈希值,备注:在Java中,不同的对象的hashCode值(和内存地址相关)要求不同。
toHexString():Integer类的方法,将一个int类型的整数转换为十六进制的字符串。
(1)为何重写hashCode方法,原因?
Student student1 = new Student(101101, “郭伟”, ‘男’, 18);
Student student2 = new Student(101101, “郭伟”, ‘男’, 18);
在Java中认为,student1和student2是不同的对象,在现实中,其实是同一个对象。
所以必须保证,student1和student2的hashCode值相同,我们必须重写hashCode方法。
(2)若两个对象的hashCode值相同,就一定是同一个对象吗?
两个对象的hashCode值相同,不一定是相同对象;此时我们借助equals方法(重写的)进一步判断。
两个对象的hashCode值不相,一定不是相同对象。
3、 equals方法
源码
public boolean equals(Object obj) {
return (this == obj);
}
为什么要重写equals方法?
两个对象的hashCode值相同,不一定是相同对象,此时我们还需进一步判断,
没有重写的equals方法(继承自Object类的equals方法),该方法判断两个对象的地址,无法满足。
重写后的equals方法,比较两个对象的所有属性值。
为什么判断两个对象时,不只用equals方法,而是用hashCode和equals方法?
若只用equals方法,效率太低。借用hashCode方法,当hashCode值不相同,肯定不是同一个对象。
当HashSet集合、HashMap集合中存放自定义对象,底层默认会调用hashCode和equals方法。
4、clone方法
克隆对象:
(1)实现Cloneable接口(没有抽象方法的接口:标记接口)
(2)重写Object类的clone()方法
(3)使用原对象调用clone方法,可以克隆一个新的对象,克隆的对象和原对象互不影响。