第十八章 Object
1 这个老祖宗类中的方法我们需要先研究一下,因为这些方法都是所有子类通用的,任何一个类默认是继承Object,就算没有直接继承,最终也会间接继承。
2 Object类当中有哪些常用的方法?
去哪里找这些方法呢?
第一种方法:去源代码当中。(但是这种方式比较麻烦,源代码也比较难)
第二种方法:去查阅java的类库的帮助文档
什么是API?
应用程序编程接口
整个JDK的类库就是一个javase的API
每一个API都会配置一套API帮助文档
目前为止我们只需要知道这几个方法即可:
protected Object clone() // 负责对象克隆的
int hashCode() // 获取对象哈希值的一个方法
boolean equals(Object obj) // 判断两个对象是否相等
String toString() // 将对象转换成字符串形式
protected void finalize() // 垃圾回收器负责调用的方法
1 Object
1.1 Object类的toString()方法
1、源代码长什么样?
public String toString(){
return getClass().getName + "@" + Integer.toHexString(hashCode());
}
源代码上toString()方法的默认实现是:
类名
1.2 Object类的equal()方法
Test02.java
1、equals方法的源代码
public boolean equals(Object obj){
return (this == obj);
}
以上这个方法是Object类的默认实现。
2、SUN公司设计equals方法的目的是什么?
以后编程的过程当中,都要通过equal方法来判断两个对象是否相等。
equals方法是判断两个对象是否相等的。
3、我们需要研究一下Object类给的这个默认的equals方法够不够用?
在Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等。
而“==”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。】
所以Object类中的equals方法不够用,需要子类重写equals方法。
4、判断两个java对象是否相等,不能使用“==”,因为“==”比较的是两个对象的内存地址。
public class Test02{
public static void main(String[] args){
// 判断两个基本数据类型的数据是否相等直接使用“==”即可
int a = 100;
int b = 100;
// 这个“==”是判断a中保存的100和b中保存的100是否相等。
System.out.println(a == b);
// 判断两个java对象是否相等,我们怎么办?能直接使用“==”吗?
// 创建一个日期对象是:2000年2月15日。
MyTime t1 = new MyTime(2000, 2, 15);
// 创建一个日期对象是,但表示的日期也是:2000年2月15日。
MyTime t2 = new MyTime(2000, 2, 15);
// 测试以下,比较两个对象是否相等,能不能使用“==”?
// 这里的“==”判断的是:t1中保存的对象内存地址和t2中保存的对象的内存地址是否相等。
System.out.println(t1 == t2);
// 重写Object equals方法之前(比较的是对象的内存地址)
/*
boolean flag = t1.equals(t2);
System.out.println(flag); // false
*/
// 重写Object equals方法之后(比较的是内容)
boolean flag = t1.equals(t2);
System.out.println(flag); // true
// 再创建一个新的日期
MyTime t3 = new MyTime(2000, 2, 16);
System.out.println(t1.equals(t3)); // false
// 我们这个程序有bug吗?没有,但是效率低。(怎么改造)