网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(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{
…
}
静态代码块在类加载时刻执行,并且只执行一次,这是一个sun准备的类加载时机。
我们可以写一下这个时机
public class Test{
public static void main(String[] args){
person p = new person();
p = null;
}
}
![img](https://img-blog.csdnimg.cn/img_convert/369a74db8b9f2b83398436ea4fecbb7b.png)
![img](https://img-blog.csdnimg.cn/img_convert/917693f5fbc8d3a2e27494d0934db801.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**