Java - 23 Object类详解

wxrwajiez / 2024-10-19 / 原文

Java - 23 Object类详解

== 与 equals()

== 既可以判断基本类型也可以判断引用类型

  • 判断基本类型,判断值是否相等
  • 判断基本类型,判断地址是否相等(是不是一个对象)

equals 是Object类的方法,只能判断引用类型

  • 默认判断地址是否相等
  • 子类中往往重写该方法:Integer [判断值是否相等], String [判断内容是否相同]
// 自己重写 equals
class Person{
     private String name;
     private int age;
     private char gender;
     
     public boolean equals(Object obj){
         // 判断是同一对象,直接返回 true
         if(this == obj){
             return true;
         }
         if(obj instanceof Person){
             Person p = (Person)obj;
             return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
         }
         return false;
     }
 }

练习

int it = 65;
float fl = 65.0f;
it == fl; // true

char ch = 'A';
it == ch; // true

"hello" == new java.sql.Date(); // 编译报错

hashCode()

返回对象的哈希值

  • 为了提高具有哈希结构的容器的效率
  • 两个引用指向同一个对象,哈希值一定一样;指向不同对象,哈希值不一样(不严谨地说)
  • 哈希值根据地址计算,但不能将哈希值等价为地址

​ 一般是将对象的内部地址(真正的地址)转换为一个整数来实现,但Java跑在虚拟机上,所以无法得到对象真正的地址

toString()

默认返回:全类名 + @ + 哈希值的十六进制

  • 子类往往重写 toString 方法

  • 当直接输出一个对象时,toString 方法会被默认调用

finalize()

当垃圾回收器确定 不存在对该对象的更多引用 时,由对象的垃圾回收器调用此方法

  • 子类可以重写该方法,做一些释放资源的操作

  • 当对象被回收(销毁)时,系统自动调用该对象的 finalize 方法

Car bmw = new Car("宝马");
bmw = null; // 这时,car对象就是一个垃圾,垃圾回收器会销毁这个对象,在销毁对象前,会调用该对象的finalize方法

程序员可以在 finalize 中写自己的业务逻辑(比如释放资源:数据库连接,打开文件...)

  • 不是对象变成垃圾就马上回收,垃圾回收器有自己的算法,也可以通过System.gc() 主动触发(不是一定触发)