一文带你认识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日

相关文章

  • JSP结合js实现img中src更新请求的方法

    JSP结合js实现img中src更新请求的方法 在网页的开发中,我们常常需要使用图片,而这些图片的加载是通过img标签的src属性实现的。有时候,我们需要通过页面上的某些操作,来更新图片的src属性,实现图片动态更新的效果。这时候就需要使用JSP结合js来实现。 步骤如下: 1.在JSP页面中使用img标签,并指定src属性,如下: <img id=&…

    Java 2023年6月15日
    00
  • SpringMvc自定义拦截器(注解)代码实例

    请看以下内容: SpringMvc自定义拦截器(注解)代码实例 在 SpringMVC 中,拦截器(Interceptor)是一个非常重要的组件,它可以在请求处理的前、后或中间加入自己的业务逻辑,例如身份认证、日志记录等。本文将详细介绍如何使用注解的方式自定义 SpringMVC 拦截器,并提供两个示例来说明其使用方法。 1. 创建拦截器类 创建一个拦截器类…

    Java 2023年5月16日
    00
  • Springmvc Controller接口代码示例

    下面是“Springmvc Controller接口代码示例”的完整攻略。 一、准备工作在开始编写示例代码之前,需要先进行一些准备工作: 确认已经安装好了Java开发环境(包括JDK和IDE)。 创建一个Springmvc项目,包括pom.xml和Web.xml两个配置文件。 配置Springmvc的注解驱动和视图解析器等相关的配置信息。 二、编写Contr…

    Java 2023年6月15日
    00
  • 浅谈Spring学习之request,session与globalSession作用域

    浅谈Spring学习之request,session与globalSession作用域 1. 介绍 在 Spring 中,我们可以通过 request、session 和 globalSession 三种作用域来存储数据。这些作用域的范围从小到大逐级升高,对应的生命周期也逐级递增,具体的介绍如下: request:处理一次请求的过程中有效,即发送一次请求到服…

    Java 2023年6月15日
    00
  • 详解CentOS 7下安装Tomcat到服务

    下面是详解CentOS 7下安装Tomcat到服务的完整攻略,分为以下步骤: 步骤一:安装Java环境 在CentOS 7下安装Tomcat之前,需要先安装Java环境,这里我们使用OpenJDK: 更新软件包: sudo yum update 安装OpenJDK: sudo yum install java-1.8.0-openjdk-devel 验证Ja…

    Java 2023年5月19日
    00
  • c# 制作gif的四种方法

    C# 制作 Gif 的四种方法 1. 使用Gifski库制作Gif Gifski是一个基于 Rust 编写的 Gif 压缩库,可以生成高质量的 Gif 图像。在 C# 中,可以通过调用 Gifski 的 DLL 文件来实现 Gif 图像的制作。 以下是使用 Gifski 制作 Gif 图像的示例: using GifskiLib; // 创建 Gifski …

    Java 2023年5月19日
    00
  • 详解JAVA 字节流和字符流

    详解JAVA 字节流和字符流 在JAVA中,流是指一种数据传输方式,可以从一个地方读入数据并传输到另一个地方,或者从一个地方写数据到另一个地方。在JAVA中,根据数据类型的不同,流分为字节流和字符流两种类型。本文将详细讲解JAVA 字节流和字符流的特点,使用场景以及相关常用类的详细使用方法。 字节流与字符流 字节流 JAVA中的字节流,是用于处理字节数据的I…

    Java 2023年5月26日
    00
  • Servlet与JSP间的两种传值情况

    Servlet与JSP是JavaEE中常见的Web开发组件,二者通常需要交互传递数据才能实现复杂的业务逻辑。下面我将详细讲解Servlet与JSP间的两种传值情况: 1. 通过URL参数传值 通过URL参数传值是Servlet与JSP间最简单的一种传值方式,它将数据作为URL的一部分直接传递给接收方。例如,我们可以在Servlet中使用以下代码设置URL并跳…

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