【API】Object和Objects

其他常见API

具体信息请查看 API 帮助文档

5. Object

Object类所在包是java.lang包。Object 是类层次结构的根,每个类都可以将 Object 作为超类(父类)。

5.1 概述及功能

所有类都直接或者间接的继承自Object类。Object类定义了一些基本的方法,对于所有对象都是通用的。

以下是Object类的主要功能:

  1. equals()方法:Object类提供了用于比较对象是否相等的equals()方法。在默认情况下,equals()方法通过比较对象的引用来确定它们是否相等。但是,它可以被子类重写以提供自定义的相等性比较规则。

  2. hashCode()方法:Object类定义了hashCode()方法,用于返回对象的散列码(哈希码)。hashCode()方法经常与equals()方法一起使用,以确保相等的对象具有相等的哈希码。hashCode()方法也可以被子类重写以提供自定义的哈希码实现。

  3. toString()方法:Object类提供了toString()方法,用于返回对象的字符串表示。默认实现返回由类名、@符号和对象的散列码组成的字符串。可以通过在子类中重写toString()方法来提供更具信息性的字符串表示形式。

  4. getClass()方法:Object类的getClass()方法返回对象的运行时类。它返回一个Class对象,该对象包含有关类的元数据信息。

  5. 垃圾回收:Object类定义了finalize()方法,当垃圾回收器准备回收对象时,会调用该方法。finalize()方法允许对象在被销毁之前执行一些清理操作。

  6. wait()、notify()和notifyAll()方法:Object类提供了用于线程间通信的wait()、notify()和notifyAll()方法。这些方法可以与synchronized关键字一起使用,以实现多线程之间的同步和协作。

5.2 常用方法

下表列出了Object类的所有方法,并提供简单的说明和示例:

方法名 说明 示例
boolean equals(Object obj) 比较对象是否相等。默认通过比较引用来判断,可以被子类重写。 Integer x = 5; Integer y = 5; x.equals(y); // true
int hashCode() 返回对象的哈希码。默认实现基于对象的内存地址,可以被子类重写。 String str = "Hello"; str.hashCode(); // 69609650
Class<?> getClass() 返回对象的运行时类。 String str = "Hello"; str.getClass(); // class java.lang.String
String toString() 返回对象的字符串表示。默认返回类名、@符号和散列码的组合,可以被子类重写。 Integer num = 10; num.toString(); // "10"
void notify() 唤醒在该对象上等待的单个线程。 synchronized (obj) { obj.notify(); }
void notifyAll() 唤醒在该对象上等待的所有线程。 synchronized (obj) { obj.notifyAll(); }
void wait() 使当前线程等待,直到该对象收到notify或notifyAll通知。 synchronized (obj) { obj.wait(); }
void finalize() 垃圾回收器准备回收对象时调用,允许对象进行一些清理操作。 protected void finalize() throws Throwable {...}

这些方法为所有Java对象提供了通用的行为和功能。equals()hashCode()方法用于比较对象的相等性和生成唯一标识。toString()方法返回对象的字符串表示形式,方便输出调试信息。getClass()方法返回对象的运行时类,用于获取类的元数据信息。wait()notify()notifyAll()方法用于实现线程间通信和同步。finalize()方法在对象被垃圾回收前执行清理操作。

5.2.1 toString()方法的重写

重写toString()方法的格式为:

@Override
public String toString() {
   
    // 生成对象字符串表示的逻辑
}

重写toString()方法的原因是为了提供更有意义和可读性的对象字符串表示,方便调试和输出信息。

例如:假设我们有一个Student类,表示一个学生的信息,包含学生的姓名、年龄和学号属性。

  • 没有重写toString()方法的情况

    调用默认toString()方法返回的是对象的类名、@符号和散列码的组合。

    示例代码如下:

    public class Student {
         
        private String name;
        private int age;
        private int studentNumber;
    
        public Student(String name, int age, int studentNumber) {
         
            this.name = name;
            this.age = age;
            this.studentNumber = studentNumber;
        }
    
        // 没有重写toString()方法
    
        public static void main(String[] args) {
         
            Student student = new Student("Tom", 18, 12345);
            System.out.println(student.toString());
        }
    }
    

    输出结果:

    Student@<散列码>
    

    这个输出结果不够直观,无法直观地看到一个学生的具体信息。

  • 重写toString()方法的情况

    返回一个更有意义和可读性的对象字符串表示。

    示例代码如下:

    public class Student {
         
        private String name;
        private int age;
        private int studentNumber;
    
        public Student(String name, int age, int studentNumber) {
         
            this.name = name;
            this.age = age;
            this.studentNumber = studentNumber;
        }
    
        @Override
        public String toString() {
         
            return "Student [name=" + name + ", age=" + age + ", studentNumber=" + studentNumber + "]";
        }
    
        public static void main(String[] args) {
         
            Student student = new Student("Tom", 18, 12345);
            System.out.println(student.toString());
        }
    }
    

    输出结果:

    Student [name=Tom, age=18, studentNumber=12345]
    

    通过重写toString()方法,我们返回了一个包含学生姓名、年龄和学号的字符串,这样就更方便看到一个学生的具体信息。

5.2.2 equals方法的重写

重写equals()方法的格式为:

@Override
public boolean equals(Object obj) {
   
    // 判断传入的对象是否与当前对象相等的逻辑
}

重写equals()方法的原因是为了自定义对象之间的相等性判断逻辑,以便符合需求。

例如:假设我们有一个Person类表示一个人的信息,包含姓名和年龄属性。

  • 没有重写equals()方法的情况

    默认情况下,调用equals()方法会使用对象的引用地址进行比较,判断两个对象是否为同一个对象。

    示例代码如下:

    public class Person {
         
        private String name;
        private int age;
        
        public Person(String name, int age) {
         
            this.name = name;
            this.age = age;
        }
        
        // 没有重写equals()方法
        
        public static void main(String[] args) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酷小洋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值