- (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;
}
}
class Person{
protected void finalize() throws Throwable{
System.out.println("即将被销毁");
}
}
注意:项目开发中可能有这样的要求:所有对象在JVM中被释放的时候,请记录一下施放时间,记录对象被释放的时间点,这个负责记录的代码写在哪里?写在finalize()方法中。
- (7)提示:
java中的垃圾回收器不是轻易启动的,垃圾太少,或者四件没到种种情况下,有可能启动也有可能不启动。
5.关于Object类中的hashcode方法
- 在Object中的hashCode()方法是怎样的:
public native int hashCode();
这个方法不是抽象方法,带有native关键字,底层调用c++程序。 - hashCode()返回的是哈希码
实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值,所以hashCode()方法的执行结果可以等同看作一个java对象的内存地址。
二.内部类
1.什么是内部类?
内部类:在类的内部又定义了一个新的类,被称为内部类。
2.内部类的分类
- 静态内部类:类似于静态变量
- 实例内部类:类似于实例变量
- 局部内部类:类似于局部变量
3.举例
使用内部类编写的代码,可读性很差,能不用尽量不用
4.匿名内部类
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新