day23object类中的方法
一、object类
这个老祖宗类中的方法我们需要先研究一下,因为这些方法都是所有子类通用的。
任何一个类默认继承Object。就算没有直接继承,最终也会间接继承。
1.1、Object类当中有哪些常用的方法?
我们去哪里找这些方法呢?
第一种方法:去源代码当中。(但是这种方式比较麻烦,源代码也比较难)
第二种方法:去查阅java的类库的帮助文档。
1.2、什么是API?
应用程序编程接口。(Application Program Interface)
整个JDK的类库就是一个javase的API。
每一个API都会配置一套API帮助文档。
SUN公司提前写好的这套类库就是API。(一般每一份API都对应一份API帮助文档。)
1.3、目前为止我们只需要知道这几个方法即可:
protected Object clone() // 负责对象克隆的。
int hashCode() // 获取对象哈希值的一个方法。
boolean equals(Object obj) // 判断两个对象是否相等
String toString() // 将对象转换成字符串形式
protected void finalize() // 垃圾回收器负责调用的方法
二、toString()
2.1、源代码长什么样?
public String toString() {
return this.getClass().getName() + “@” + Integer.toHexString(hashCode());
}
源代码上toString()方法的默认实现是:
类名@对象的内存地址转换为十六进制的形式
2.2、设计toString()方法的目的是什么?
toString()方法的作用是什么?
toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成“字符串表示形式”
2.3、建议所有的子类都去重写toString()方法。
其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。
toString()方法应该是一个简洁的、详实的、易阅读的.
2.4、注意
1、以后所有类的toString()方法是需要重写的。重写规则,越简单越明了就好。
2、System.out.println(引用); 例子:System.out.println(rq1.toString());
这里会自动调用“引用”的toString()方法。
3、String类是SUN写的,toString方法已经重写了。
三、equals()方法
3.1、equals方法的源代码
public boolean equals(Object obj) {
return (this == obj);
}
以上这个方法是Object类的默认实现。
3.2、设计equals方法的目的是什么?
1、以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。
2、功能:equals方法是判断两个对象是否相等的。
3.3、默认的equals方法够不够用
1、在Object类中的equals方法当中,默认采用的是“”判断两个java对象是否相等。而“”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。
3.4、判断两个java对象是否相等
1、判断两个java对象是否相等,不能使用“”,因为“”比较的是两个对象的内存地址。
3.5、使用场景
1、基本数据类型比较实用:==
2、对象和对象比较:调用equals方法
3.6、注意:
1、以后所有类的equals方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较内容,所以需要重写。
2、重写规则:自己定,主要看是什么和什么相等时表示两个对象相等。
3、String类是SUN编写的,所以String类的equals方法重写了。以后判断两个字符串是否相等,最好不要使用==,要调用字符串对象的equals方法。因为String有两种形式:你不知道有当时定义的时候用的是哪种形式。所以比较的时候最好都用equals方法。
1、string =“abc”;
2、string s2=new string(“abc”);
4、重写equals方法的时候要彻底。
5、此方法用IDEA可以自动生成。
四、String类
String类重写了toString()和equals()方法。
//String中重写了toString()和equals()
public class Test02 {
public static void main(String[] args) {
String s1="abc";
String s2=new String("abc");
String s3="abc";
System.out.println(s1==s2);//false
System.out.println(s1==s3);//true
//String中重写了equals()方法
System.out.println(s1.equals(s2));//true
//string中重写了toString()方法
String x=new String("陈绪杰");
//可以直接输出引用
System.out.println(x);//陈绪杰
System.out.println(x.toString());//陈绪杰
}
}
五、finalize()方法:JDK9以上的版本就不用了
4.1、finalize()方法。垃圾销毁时机
这个方法是protected修饰的,在Object类中这个方法的源代码是?
protected void finalize() throws Throwable { }
finalize()方法只有一个方法体,里面没有代码,
GC:负责调用finalize()方法。
4.2、finalize()方法的执行时机:
1、当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
2、finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
4.3、怎么使用:
当一个对象为空的时候可能会被调用例子:
A a=new A();
a=null;
1、这个方法不需要程序员手动调用,JVM的垃圾回收器负责调用这个方法。
2、finalize()只需要重写,重写完将来自动会有程序来调用。
4.4、提示:
1、java中的垃圾回收器不是轻易启动的。
2、垃圾太少,或者时间没到,种种条件下。
3、有可能启动,也有可能不启动。
4、 有一段代码可以建议垃圾回收器启动。
System.gc(); // 建议启动垃圾回收器。(只是建议,可能不启动,也可能启动。启动的概率高了一些。)jdk8启动的概率高。
4.5、应用场景
项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间!!!
六、hashCode()
6.1、hashCode方法?返回一个对象的哈希码。
public native int hashCode();
这个方法不是抽象方法,带有native关键字,底层调用C++程序。
6.2、hashCode()方法返回结果:
1、hashCode()方法返回的是哈希码:
2、实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
6.3、使用方法:
直接调用,不需要重写
例子:
A a=new A();
System.out.println(a.hashCode());