Java中Object类常用的12个方法(小结)

Java中Object类常用的12个方法(小结)

在Java中,Object类是所有类的根类,其包含了许多常用的方法。以下是Java中Object类常用的12个方法:

equals

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 (obj == null) {
            return false;
        }

        if (!(obj instanceof Person)) {
            return false;
        }

        Person other = (Person) obj;
        return this.name.equals(other.name) && this.age == other.age;
    }
}

Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);
System.out.println(p1.equals(p2)); // true

hashCode

hashCode方法返回对象的哈希码,如果两个对象相等,那么它们的哈希码一定相等。如果在自定义类中重写了equals方法,也应该重写hashCode方法,以便可以使使用该对象的哈希数据结构(如HashSet或HashMap)更加高效。

示例代码:

public class Person {
    private String name;
    private int age;

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        if (!(obj instanceof Person)) {
            return false;
        }

        Person other = (Person) obj;
        return this.name.equals(other.name) && this.age == other.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);
System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode() == p2.hashCode()); // true

toString

toString方法返回一个包含对象信息的字符串,通常它被用来调试类的实例。

示例代码:

public class Person {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Person p1 = new Person("Tom", 18);
System.out.println(p1); // Person{name='Tom', age=18}

getClass

getClass方法返回对象的类对象,它可以用于获得该对象的具体类型,或者在反射中使用。

示例代码:

Person p1 = new Person("Tom", 18);
Class<? extends Person> clazz = p1.getClass();
System.out.println(clazz.getName()); // com.example.Person

finalize

finalize方法是Java中对象的垃圾回收方法,它指定了在对象被回收前需要执行哪些操作。这个方法一般不需要手动调用,而是由垃圾回收器自动调用。

示例代码:

public class Person {
    @Override
    protected void finalize() {
        System.out.println("The object is being finalized.");
    }
}

Person p1 = new Person();
p1 = null;
System.gc(); // 建议垃圾回收器尽快回收垃圾

clone

clone方法用于创建当前对象的一个副本(浅拷贝),一般在需要复制某个对象时使用。需要注意的是,在使用clone方法时,需要保证被复制的对象实现Cloneable接口,否则在运行时会抛出CloneNotSupportedException异常。

示例代码:

public class Person implements Cloneable {
    private String name;
    private int age;

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Person p1 = new Person("Tom", 18);
Person p2 = (Person) p1.clone();
System.out.println(p1 == p2); // false

notify和wait

notifywait方法是在多线程编程中使用的方法,它们用于在共享资源的同步机制中协作,实现线程的等待和唤醒。

示例代码:

public class SharedResource {
    private int value;

    synchronized void setValue(int value) {
        this.value = value;
        notify();
    }

    synchronized int getValue() throws InterruptedException {
        while (value == 0) {
            wait();
        }
        int result = value;
        value = 0;
        return result;
    }
}

SharedResource sr = new SharedResource();

Thread t1 = new Thread(() -> {
    try {
        Thread.sleep(1000); // 让t2先运行
        sr.setValue(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

Thread t2 = new Thread(() -> {
    try {
        int result = sr.getValue();
        System.out.println(result); // 输出10
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();
t2.start();

notifyAll

notifyAll方法用于唤醒在该对象上等待的所有线程。

示例代码:

public class SharedResource {
    private int value;

    synchronized void setValue(int value) {
        this.value = value;
        notifyAll();
    }

    synchronized int getValue() throws InterruptedException {
        while (value == 0) {
            wait();
        }
        int result = value;
        value = 0;
        return result;
    }
}

SharedResource sr = new SharedResource();

Thread t1 = new Thread(() -> {
    try {
        Thread.sleep(1000); // 让t2先运行
        sr.setValue(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

Thread t2 = new Thread(() -> {
    try {
        sr.getValue();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

Thread t3 = new Thread(() -> {
    try {
        sr.getValue();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();
t2.start();
t3.start();

finalize

finalize方法是Java中对象的垃圾回收方法,它指定了在对象被回收前需要执行哪些操作。这个方法一般不需要手动调用,而是由垃圾回收器自动调用。

示例代码:

public class Person {
    @Override
    protected void finalize() {
        System.out.println("The object is being finalized.");
    }
}

Person p1 = new Person();
p1 = null;
System.gc(); // 建议垃圾回收器尽快回收垃圾

getClass

getClass方法返回对象的类对象,它可以用于获得该对象的具体类型,或者在反射中使用。

示例代码:

Person p1 = new Person("Tom", 18);
Class<? extends Person> clazz = p1.getClass();
System.out.println(clazz.getName()); // com.example.Person

finalize

finalize方法是Java中对象的垃圾回收方法,它指定了在对象被回收前需要执行哪些操作。这个方法一般不需要手动调用,而是由垃圾回收器自动调用。

示例代码:

public class Person {
    @Override
    protected void finalize() {
        System.out.println("The object is being finalized.");
    }
}

Person p1 = new Person();
p1 = null;
System.gc(); // 建议垃圾回收器尽快回收垃圾

getClass

getClass方法返回对象的类对象,它可以用于获得该对象的具体类型,或者在反射中使用。

示例代码:

Person p1 = new Person("Tom", 18);
Class<? extends Person> clazz = p1.getClass();
System.out.println(clazz.getName()); // com.example.Person

总结

Java中Object类提供了许多常用的方法,包括equalshashCodetoStringgetClassclonenotifywaitnotifyAllfinalize等。学习并掌握这些方法可以帮助我们更加高效地设计和开发Java程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中Object类常用的12个方法(小结) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 本地编译打包项目部署到服务器并且启动方式

    下面是本地编译打包项目部署到服务器并且启动方式的完整攻略: 准备工作 确定服务器的操作系统、IP地址、用户名和密码等信息。 确认服务器是否已经安装项目依赖的环境(例如Node.js、Java等)。 安装需要的打包工具(例如Maven、Gradle等),并且熟悉其中的一种。 步骤说明 以下是部署项目到服务器的步骤: 步骤一:本地编译打包项目 使用打包工具对项目…

    Java 2023年5月26日
    00
  • Mybatis之类型处理器TypeHandler的作用与自定义方式

    下面是针对MyBatis中的类型处理器TypeHandler的作用与自定义方式的完整攻略。 什么是TypeHandler TypeHandler是Mybatis中一种类型转换器,用于将Java类中的数据类型转换为数据库中对应字段的类型或者将数据库查询结果的数据类型转换为Java对象中的数据类型。 例如,在将Java类中的Date类型转换成数据库中的Times…

    Java 2023年5月20日
    00
  • SpringBoot打jar包遇到的xml文件丢失的解决方案

    Spring Boot是一个快速开发应用程序的框架,它通过约定大于配置的方式规范了配置文件和代码结构,从而降低了开发复杂度,并提高了开发效率。但是在使用Spring Boot打jar包时,很容易遇到一些问题,比如xml文件丢失的问题。本文将介绍一些解决方案来解决这个问题。 问题描述 在使用Spring Boot打jar包时,可能会遇到一些xml文件丢失的问题…

    Java 2023年6月15日
    00
  • Java窗口精细全方位讲解

    Java窗口精细全方位讲解 简介 本篇攻略将完整讲解如何用Java语言创建窗口并增加各种控件,包括文本框、按钮、下拉框等等,并讲解如何实现它们的交互功能。 准备工作 在开始编程前,你需要安装Java开发工具包(JDK)和一个编译器,比如Eclipse或者IntelliJ IDEA。这里我们以Eclipse为例。 创建窗口 要创建窗口,我们需要创建一个新的Ja…

    Java 2023年5月23日
    00
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    下面是 “SpringBoot整合MyBatis和MyBatis-Plus的详细步骤”。 1. 添加依赖 首先,在 pom.xml 中添加以下依赖: <!– SpringBoot 整合 MyBatis 依赖 –> <dependency> <groupId>org.mybatis.spring.boot</gro…

    Java 2023年5月20日
    00
  • 如何使用Reactor完成类似Flink的操作

    使用Reactor完成类似Flink的操作可以分为以下几个步骤: 创建Flux或Mono:首先需要创建Flux或Mono,Flux表示可以产生多个数据流,Mono表示只能产生一个数据流; 转换Flux或Mono:可以使用map()、flatMap()、filter()等函数对Flux或Mono进行转换,获得想要的结果; 订阅Flux或Mono:最后需要订阅F…

    Java 2023年5月20日
    00
  • SpringBoot如何使用Undertow做服务器

    使用Undertow作为SpringBoot服务器可以提高系统的性能、稳定性和安全性。以下是使用Undertow作为SpringBoot服务器的完整攻略: 第一步:添加依赖 在pom.xml中添加Undertow的依赖: <dependency> <groupId>org.springframework.boot</groupI…

    Java 2023年5月20日
    00
  • 浅谈Java中的final关键字与C#中的const, readonly关键字

    浅谈Java中的final关键字与C#中的const, readonly关键字 在Java和C#中,我们都可以使用final、const和readonly来定义常量。但是,它们在使用上有些许差异。 Java中的final关键字 在Java中,使用final关键字可以定义常量。它可以被用于修饰变量、类或方法。当用于定义变量时,final表示该变量的值一旦被赋值…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部