Object这个老祖宗类中的方法我们需要研究一下,因为这些方法都是所有子类通用的,任何一个类都默认继承Object类
Object类中有哪些常用的方法?
//判断两个基本数据类型的数据是否相等直接使用"=="就行
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);
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方法
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;
对象和对象比较:调用equals方法
String类是sun公司写的,所以String类的equals方法重写了。以后判断两个字符串是否相等,最好不要用==,要调用equals方法。
注意:这个方法在JDK9开始过时了
我们可以写一下这个时机
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()方法中。
内部类:在类的内部又定义了一个新的类,被称为内部类。
使用内部类编写的代码,可读性很差,能不用尽量不用
匿名内部类是局部内部类的一种,因为这个类没有名字而得名,叫做匿名内部类。
这个表面看上去好像是接口可以直接new了,实际上并不是接口可以new,后面的{ }代表了对接口的实现。
为什么不建议使用匿名内部类?
因为一个类没有名字,没有办法重复使用,另外代码太乱,可读性太差。
学习匿名内部类是为了让大家以后阅读别人的代码的时候能够理解,并不代表以后都要这样写,因为匿名内部类有两个缺点:
——缺点一:太复杂,太乱,可读性差。
——缺点二:类没有名字,以后想重复使用,不能用。