一文带你认识Java中的Object类和深浅拷贝

一文带你认识Java中的Object类和深浅拷贝

1. Object类

在Java中,所有的类都是从java.lang.Object类继承而来的。因此,java.lang.Object是Java中的祖先类,拥有以下常用的方法:

  • equals(Object obj): 判断当前对象是否与参数obj相等,可以重写该方法来实现对象的比较
  • hashCode(): 返回对象的hash值
  • toString(): 返回一个字符串,该字符串包含当前对象的类名、hash值等信息
  • getClass(): 返回当前对象的类的Class对象
  • clone(): 克隆当前对象,可以实现浅拷贝

示例1: java.lang.Object的使用

public class Person {
    private String name;
    private int age;
    private boolean gender;
    // 省略构造器、getter、setter等方法

    @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 && gender == person.gender && Objects.equals(name, person.name);
    }

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

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

public class Main {
    public static void main(String[] args) {
        Person p1=new Person("Tom",18,true);
        Person p2=new Person("Tom",18,true);
        System.out.println(p1.equals(p2));   // true
        System.out.println(p1.hashCode());  // -439625624
        System.out.println(p1.toString());  // Person{name='Tom', age=18, gender=true}
        System.out.println(p1.getClass());  // class Person
        System.out.println(p1.clone());     // Person{name='Tom', age=18, gender=true}
    }
}

2. 浅拷贝与深拷贝

在Java中,对象拷贝分为浅拷贝和深拷贝。

浅拷贝:将一个对象的引用赋值给另一个对象,而这两个对象选在内部的引用都指向同一个对象。当我们修改其中一个对象中的内部数据时,另一个对象中对应的内部数据也会发生改变。

深拷贝:在堆内存中开辟一个新的空间,将原对象的所有属性都复制到新的空间中,从而实现两个对象之间互不干扰。

示例2: 深拷贝和浅拷贝的比较

public class Address {
    private String detail;
    public Address(String detail) {
        this.detail = detail;
    }
    // 省略getter、setter等方法
}

public class User implements Cloneable {
    private String name;
    private Address address;
    // 省略构造器、getter、setter等方法

    @Override
    public User clone() throws CloneNotSupportedException {
        User user = (User) super.clone();
        user.setAddress(new Address(this.getAddress().getDetail()));
        return user;
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        User u1 = new User("Tom", new Address("广东省"));
        User u2 = u1.clone();
        u2.getAddress().setDetail("湖南省");
        System.out.println(u1.getAddress().getDetail());  // 广东省
        System.out.println(u2.getAddress().getDetail());  // 湖南省
    }
}

在上面的示例中,我们创建了一个User类和Address类,它们的关系是User包含一个Address的引用。我们编写了一个clone方法,手动实现了User类的深拷贝。在运行程序时,我们创建了一个用户u1,将它的克隆对象u2指向u1,然后修改了u2的地址,但是并没有影响到u1。

总结

在Java中,Object类是所有类的父类,提供了一些实用的方法。深拷贝和浅拷贝是解决对象拷贝时可能出现的问题的两种方式。深拷贝和浅拷贝分别用于处理对象内部属性是值类型或者引用类型的情况下的对象拷贝问题。深拷贝需要手动实现,使用clone来返回拷贝出来的对象,一般使用BeanUtils等工具类可以替代手动实现深拷贝,而浅拷贝则是直接将对象的引用复制给新对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你认识Java中的Object类和深浅拷贝 - Python技术站

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

相关文章

  • SpringBoot+MyBatis+AOP实现读写分离的示例代码

    这里就详细讲解一下”SpringBoot+MyBatis+AOP实现读写分离”的完整攻略。本文会介绍什么是读写分离,如何使用SpringBoot、Mybatis和AOP实现读写分离,以及两个示例说明。 什么是读写分离 首先,我们需要了解一下什么是读写分离。在高并发的系统中,读取数据库的操作通常是多余写入的操作的。因此,将查询请求分发到只读数据库,减少了对主数…

    Java 2023年5月19日
    00
  • 扩展Hibernate使用自定义数据库连接池的方法

    下面我为你介绍如何扩展Hibernate使用自定义数据库连接池的方法。 概述 在Hibernate中,数据库连接池是默认使用的连接池。但是,也可以通过使用自定义连接池来满足特定的需求。本文将演示如何扩展Hibernate使用自定义数据库连接池的方法。 实现步骤 步骤一:编写自定义连接池类 首先,我们需要编写一个类来实现我们的自定义连接池。这个类需要实现Hib…

    Java 2023年5月19日
    00
  • jsp实现针对excel及word文档的打印方法

    当我们需要在JSP页面中实现自定义打印Excel及Word文档的功能,主要需要以下步骤: 在JSP页面中定义需要打印的Excel或Word文档,通常是通过使用文件名标签或者使用input type=”file”>标签上传的方式获取文件。 例如: 将上传的文件保存在服务器端,通常是通过使用Apache POI库实现。 例如: //获取上传的Excel文件…

    Java 2023年6月15日
    00
  • SpringBoot集成Shiro进行权限控制和管理的示例

    下面我来详细讲解“SpringBoot集成Shiro进行权限控制和管理的示例”的完整攻略。 什么是 Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密等功能,可以轻松地保护应用程序的安全与隐私。 SpringBoot 集成 Shiro 下面是 SpringBoot 集成 Shiro 进行权限控制和管…

    Java 2023年6月15日
    00
  • Java超详细讲解接口的实现与用法

    Java超详细讲解接口的实现与用法 什么是接口 在Java中,接口是一个与类有相似结构的抽象数据类型。与类不同的是,它只定义一组规范,而不实现这些规范。接口中定义的方法没有具体的实现逻辑,只是给出了方法的签名与返回值类型。 接口的定义与实现 定义接口可以使用interface关键字,接口中可以定义方法和属性。接口中的方法是公共的(public),没有方法体(…

    Java 2023年5月18日
    00
  • Springboot接收 Form 表单数据的示例详解

    Springboot接收 Form 表单数据的示例详解 在Springboot项目中,我们通常需要处理表单数据。这里我们将介绍如何接收Form表单数据,并完成对应的业务逻辑。 请求方式 在Springboot中,表单数据通常是通过POST请求提交的。所以,我们需要使用@RequestMapping注解来处理POST请求。 @PostMapping(&quot…

    Java 2023年5月20日
    00
  • SpringBoot浅析依赖管理与自动配置概念与使用

    SpringBoot浅析依赖管理与自动配置概念与使用 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、便捷的方式来创建基于Spring的应用程序,同时也提供了一些有用的功能,如自动配置、依赖管理等。在本文中,我们将详细讲解Spring Boot的依赖管理和自动配置概念与使用。 依赖管理 在Spring Boot中,…

    Java 2023年5月15日
    00
  • PHP-Java-Bridge使用笔记

    PHP-Java-Bridge使用笔记 什么是PHP-Java-Bridge? PHP-Java-Bridge是一个连接PHP和Java的桥梁,提供了一种方法来使用PHP脚本访问Java类库和执行Java代码。它支持通过Java应用程序服务器从PHP访问Java组件。 安装PHP-Java-Bridge 下载PHP-Java-Bridge 可以从官网 htt…

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