-
Object这个老祖宗类中的方法我们需要研究一下,因为这些方法都是所有子类通用的,任何一个类都默认继承Object类
-
Object类中有哪些常用的方法?
- 我们去哪里找这些方法?
第一种:去源代码当中(但是这种方法比较麻烦,源代码也比较难)
第二种:去查阅java类库的帮助文档 - 什么是API?
应用程序编程接口(Application Program Interface)
整个JDK的类库就是一个JavaSE的API
每一个API都会配置一套API帮助文档
SUN公司提前写好的这套类库就是API(一般一份API对应一份API帮助文档) - 目前我们需要知道哪几个方法?
(1)protected Object clone() //负责对象克隆的
(2)int hashCode() //获取对象哈希值的一个方法
(3)boolean equals(Object obj) //判断两个对象是否相等
(4)String toString()<fontcolor=red> //将对象转换为字符串的形式
(5)protected void finaliaze() //垃圾回收器负责调用的方法
- 我们去哪里找这些方法?
2.关于Object类中的toString()方法
- (1)源代码
- (2)源代码上toString()方法的默认实现是:类名@对象的内存地址转换为十六进制的形式
- (3)SUN公司设计toSrting()方法的目的是什么?
通过调用这和方法可以将一个“java对象”转换成“字符串” - (4)其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法,toString()方法应该是一个简洁的,详实的,易阅读的。
3.关于Object类中的equals()方法
- (1)源代码
- (2)SUN公司设计equals方法的目的是什么?
以后编程的过程中,都要通过equals方法来判断两个对象是否相等,equals方法是判断两个对象是否相等的。 - (3)我们需要研究一下Object类给的这个默认的equals方法够不够用
在Object类中的equals方法当中默认采用的是"= ="判断两个对象是否相等,而 "= ="判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等,所以equals方法不够用,需要子类重写equals。 - (4)判断两个java对象是否相等,不能使用"= =“,因为”= ="比较的是两个对象的内存地址。
//判断两个基本数据类型的数据是否相等直接使用"=="就行
int a = 100;
int b = 100;
//这个"=="是判断a中保存的100和b中保存的100是否相等
System.out.println(a == b);//ture(相等) false(不相等)
//创建两个java对象是否相等,我们怎么做?能直接使用"=="吗?
//创建一个日期对象是:2022年9月11日
Mytime t1 = new Mytime(2022,9,11);//假设Mytime t1的内存地址为0x1234
//创建一个新的日期对象,但表示的日期也是:2022年9月11日
Mytime t2 = new Mytime(2022,9,11);//而t2 的内存地址为0x2345
//测试一下,比较两个对象是否相等,能不能使用"=="
//这里的"=="判断的是:t1保存的对象内存地址和t2中保存的内存地址是否相等
System.out.println(t1 == t2);
- (5)怎么重写?
package com.bjpowernode.java.csdntest;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
public class csdntest02 {
public static void main(String[] args) {
MyTime m1 = new MyTime(2022,9,11);
MyTime m2 = new MyTime(2022,9,11);
boolean flag = m1.equals(m2);
System.out.println(flag);
}
}
class MyTime {
int year;
int month;
int day;
public MyTime() {
}
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public boolean equals(Object obj) {
int year1 = this.year;
int month1 = this.month;
int day1 = this.day;
if (obj instanceof MyTime){
MyTime mt = (MyTime)obj;
int year2 = this.year;
int month2 = this.month;
int day2 = this.day;
if (year1==year2&&month1==month2&&day1==day2){
return true;
}
}
return false;
}
}
- ***上述equals方法有些冗余,怎么改进呢?***
//改良equals方法
public boolean equals(Object obj) {
//如果obj是空,直接返回false
if (obj == null){
return false;
}
if (!(obj instanceof MyTime)){
//如果obj不是一个MyTime,没必要比较了,直接返回false
return false;
}
if (this == obj){
//如果this和obj保存的呢村地址相同,没必要比较了,直接返回true
//内存地址相同的时候指向的堆内存的对象肯定是同一个
return true;
}
//程序能够执行到此处说明什么?
//说明obj不是null,obj是MyTime类型
//
MyTime t = (MyTime)obj;
if (this.year==t.year&&this.month==t.month&&this.day==t.day){
return true;
}
//程序能执行到这里直接返回false
return false;
- 总结:toString方法
以后所有类的toString方法是需要重写的。重写规则:越简单越明了越好
System.out,println(引用);这里会自动调用“引用”的toString方法。String类是sun公司写的,toString方法已经重写了。 - equals方法
以后所有类的equals方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较内容,所以要重写。重写规则:自己定,主要是看什么和什么相等时表示两个对象相等。
基本数据类型比较实用: ==
对象和对象比较:调用equals方法
String类是sun公司写的,所以String类的equals方法重写了。以后判断两个字符串是否相等,最好不要用==,要调用equals方法。
4.关于Object类中的finalize()方法
注意:这个方法在JDK9开始过时了
- (1)这个方法是protected修饰的,只有一个方法体,里面没代码。
- (2)在Object类中的源代码:
- (3)这个方法不需要程序员手动调用,JVM的垃圾回收机制负责调用这个方法
- (4)finalize()方法的执行时机
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。 - (5)finalize()方法实际上是sun公司为java程序员准备的一个时机,垃圾销毁时机。如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法中。
- (6)静态代码块的作用是什么?
static{
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新