Object 类详解

Object 类详解

Object类是所有类的根类,也称为顶级父类。所有类都直接或间接地继承自Object类,因此Object类中定义了所有Java对象的通用行为和方法。

Object类中的一些常用方法包括:

  1. equals(Object obj):用于比较两个对象是否相等。
  2. hashCode():返回对象的哈希码值。
  3. toString():返回对象的字符串表示。
  4. 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()方法用于返回对象的哈希码值,即对象在内存中的地址经过哈希算法得到的一个整数值。

哈希码值在对象的存储和查找中起着重要的作用,比如在使用HashMapHashSet等集合类时,会根据对象的哈希码值来确定对象在集合中的位置,以提高查找和插入的效率。

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("释放了某些资源	");


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林小果呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值