Object 类详解
Object类是所有类的根类,也称为顶级父类。所有类都直接或间接地继承自Object类,因此Object类中定义了所有Java对象的通用行为和方法。
Object类中的一些常用方法包括:
- equals(Object obj):用于比较两个对象是否相等。
- hashCode():返回对象的哈希码值。
- toString():返回对象的字符串表示。
- finalize():在对象被垃圾回收之前调用。
1. equals
equals(Object a, Object b):比较两个对象是否相等。该方法会处理空指针异常,如果两个对象都为null,则返回true,如果其中一个为null,则返回false。
== 和 equals 的对比:
- == 是一个比较运算符,既可以判断基本类型,又可以判断引用类型,如果判断引用类型,判断的是地址是否相等。
- equals是Objects类中的方法,只能判断引用类型。
源码
下面为Objects源码中的equals方法:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
重写equals
在我们自己创建的类中我们可以重写equals方法来定义比较规则。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Alice", 25);
if (person1.equals(person2)) {
System.out.println("两个Person对象内容相等");
} else {
System.out.println("两个Person对象内容不相等");
}
}
}
2. hashCode
hashCode()
方法用于返回对象的哈希码值,即对象在内存中的地址经过哈希算法得到的一个整数值。哈希码值在对象的存储和查找中起着重要的作用,比如在使用
HashMap
、HashSet
等集合类时,会根据对象的哈希码值来确定对象在集合中的位置,以提高查找和插入的效率。
3. toString
在Java中,
Object
类中的toString()
方法用于返回对象的字符串表示。当我们打印一个对象时,实际上是调用了对象的toString()
方法来获取对象的字符串表示,以便于查看对象的内容。
源码
默认情况下,toString()
方法返回的是一个包含类名和对象的哈希码值的字符串,格式为类名@哈希码值。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
重写hashCode
默认实现通常不够直观和有用,因此在实际开发中,我们通常会重写toString()
方法,以便返回对象的更有意义的字符串表示,比如对象的属性值等。
通过重写toString()
方法,我们可以根据需要自定义对象的字符串表示,使其更易于阅读和理解。通常在自定义类中重写toString()
方法是一个良好的实践,可以方便调试和输出对象的信息。
例如,假设有一个Person
类,可以重写toString()
方法来返回人的姓名和年龄等信息,如下所示:
public class Person {
private String name;
private int age;
// 构造方法、getter和setter等省略
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
java复制代码
通过重写toString()
方法,我们可以在打印Person
对象时直接输出人的姓名和年龄信息,而不是默认的类名和哈希码值。
4. finalize
当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作。
当一个对象变成不可达时(即没有任何引用指向该对象),垃圾回收器会在某个时间点将其回收。在回收对象之前,垃圾回收器会调用对象的
finalize()
方法,以便对象在被回收之前执行一些清理工作,比如释放资源、关闭连接等。垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制。
代码示例
public class Finalize_ {
public static void main(String[] args) {
Car bmw = new Car("宝马");
//这时 car 对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的 finalize 方法
//,程序员就可以在 finalize 中,写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件..)
//,如果程序员不重写 finalize,那么就会调用 Object 类的 finalize, 即默认处理
//,如果程序员重写了 finalize, 就可以实现自己的逻辑
bmw = null;
System.gc();//主动调用垃圾回收器
System.out.println("程序退出了 ");
}
}
class Car {
private String name;
//属性, 资源。。
public Car(String name) { this.name = name;
}
//重写 finalize @Override
protected void finalize() throws Throwable {
System.out.println("我们销毁 汽车" + name );
System.out.println("释放了某些资源 ");
}
}