`
qq466862016
  • 浏览: 128541 次
  • 来自: 杭州
社区版块
存档分类
最新评论

Java中对象拷贝方式有哪几种?

阅读更多

1.引用拷贝

 

        Person p = new Person();
        p.setAge(1);
        p.setName("jack");
        p.setDog(new Dog("tom..."));
        Person p1 = p;
        System.err.println("p=" +p +",p1="+p1);

 2.浅拷贝

 

package com.xx.tt.copy;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/***
 *
 *  @author xxxxx
 *  @date 2018-09-25 10:00
 */
public class Person  implements Cloneable{


    private String name;
    private int age;



    private Dog dog;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {



        try {

            Object o = super.clone();
          Person p =  (Person) o;

         

            return p;
        }catch (CloneNotSupportedException e){
                e.printStackTrace();
        }
        return null;

    }


    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
    }
}

 

3.深拷贝

package com.xx.tt.copy;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/***
 *
 *  @author xxx
 *  @date 2018-09-25 10:00
 */
public class Person  implements Cloneable{


    private String name;
    private int age;



    private Dog dog;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {



        try {

            Object o = super.clone();
          Person p =  (Person) o;

            Object dog = this.dog.clone();
            p.dog = (Dog) dog;

            return p;
        }catch (CloneNotSupportedException e){
                e.printStackTrace();
        }
        return null;

    }


    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
    }
}

        实际上浅拷贝和深拷贝实现Cloneable接口并重写clone方法,区别是浅拷贝只实现自己本身的拷贝,深拷贝是拷贝自己和自己的非基础数据类型的成员也要依次拷贝

 

 4.串行化拷贝

     特点必须实现Serialable接口,使用ObjectInputStream和ObjectOutputStream两个类来实现复制拷贝功能(序列化和反序列化)。

 

分享到:
评论

相关推荐

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    首先,我们要理解Java中的对象复制有浅拷贝和深拷贝两种方式。浅拷贝只复制对象本身,不复制引用的对象;深拷贝不仅复制对象,还复制对象中引用的对象。在描述中提到的方法,很可能是关于深拷贝的实现。 在Java中,...

    java对象的 生命周期

    对象的创建是生命周期的起点,通常通过以下几种方式实现: 1. **使用`new`语句**:这是最常见的创建对象的方法,例如`new Customer("Tom", 20)`。这种方式会调用类的构造方法,初始化对象的状态。 2. **反射机制**...

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    根据给定文件的信息,我们可以总结出以下几个面向对象的基础知识点,并结合具体的题目来进行解析: ### 面向对象基础知识概述 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它将数据和处理...

    java对象和对象的引用之间的关系

    Java中的参数传递有两种方式:基本类型的值传递和引用类型的引用传递。对于基本类型(如`int`),传递的是值的副本;而对于引用类型(如`StringBuffer`),传递的是引用的副本。这意味着对于引用类型的参数,如果在...

    java-数组与方法及面向对象基础

    Java是一种广泛使用的编程语言,以其跨平台、面向对象的特点深受开发者喜爱。本教程将深入探讨Java中的数组、方法以及面向对象编程的基础概念,为初学者提供一个全面的学习指南。 一、数组 数组在Java中是存储同一...

    Java第三章习题

    在 Java 中,面向对象编程的实现可以通过以下几种方式: 1. 类的设计:设计类的结构和成员变量。 2. 对象的创建:创建对象的实例。 3. 方法的实现:实现成员方法。 4.继承和多态:实现继承和多态机制。 Java 程序...

    深入Java对象及元素的存储区域

    ### 深入Java对象及元素的存储区域 ...通过深入了解Java对象及元素在不同存储区域中的分配方式及其对性能的影响,开发者可以更加高效地进行内存管理和性能优化,从而提高Java应用程序的整体性能。

    java的几种设计模式

    下面,我们将深入探讨几种重要的Java设计模式。 1. **单例模式**:保证一个类只有一个实例,并提供全局访问点。这种模式常用于配置中心、线程池等需要全局共享的对象。实现方式有懒汉式(线程不安全)、饿汉式...

    第一章认识Java.

    - **面向对象**:Java是一种完全面向对象的语言,支持继承、封装和多态等核心概念。 - **分布式**:Java内置了对网络通信的支持,使得开发者能够轻松构建分布式系统。 - **半编译半解释**:Java源代码首先会被编译成...

    Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier

    在Java开发中,Bean复制是一项常见的任务,尤其是在数据转换和服务层之间传递对象时。这篇文章将对比分析Apache BeanUtils、PropertyUtils、Spring BeanUtils以及Cglib BeanCopier这四个常用的Bean复制工具的性能和...

    java 复制数组的资源

    有几种不同的方法可以实现数组的复制,每种方法都有其特定的适用场景。以下将详细阐述Java中复制数组的主要方法: 1. **浅拷贝(Shallow Copy)**: - `System.arraycopy()`:这是Java中最直接、最高效的方式来...

    Java面试题,常见面试题及答案汇总.docx

    3. 创建线程有哪几种方式? Answer: 可以通过继承Thread类、实现Runnable接口或使用线程池来创建线程。 反射 1. 什么是反射? Answer: 反射是Java提供的一种机制,允许在运行时获取类和对象的信息,并进行修改。 2...

    java下载文件的种方式

    这篇博客"java下载文件的种方式"可能详细介绍了几种不同的Java实现文件下载的方法。以下是对这些方法的总结和扩展: 1. **HTTP响应流下载** 这是最基本的方式,通过Servlet或Spring MVC等框架处理HTTP请求,然后在...

    垃圾回收算法有几种类型? 他们对应的优缺点又是什么?(csdn)————程序.pdf

    垃圾回收是计算机编程,尤其是Java和许多其他现代编程语言中的一个关键概念,它自动管理程序的内存,确保不再使用的对象能够被有效地释放,以便为新的对象分配空间。以下是几种常见的垃圾回收算法及其优缺点的详细...

    Java面试宝典-经典

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java面向对象

    封装特性主要通过以下几种方式实现: 1. **使用访问控制符**:通过`public`、`protected`、`private`和`default`来控制类成员的可见性。 2. **使用getter和setter方法**:通过这些方法来访问和修改对象的属性。 3. ...

    java几种常用的设计模式源码和心得

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和复用性。本资源包含了2016年6月20日关于Java常用设计模式的源码和作者的心得体会,这对于我们深入...

    超级有影响力霸气的Java面试题大全文档

     对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...

Global site tag (gtag.js) - Google Analytics