`

Java 深复制 浅复制 api解读

    博客分类:
  • J2EE
阅读更多
今天看了下java下面的深浅复制问题,借鉴了网上资料自己整理一下。
Object中含有clone()方法,文章就在clone了里面了。
 @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

查看api,里面有此段描述:
按照惯例,clone()返回的对象应该独立于正被复制的对象。要获得此独立性,在super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被复制对象的内部“深层结构”的所有可变对象(即对象中的对象),并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要重载clone()。

下面的代码注释完整,能够自我解释。

//Cloneable必须实现
class StudentInfo implements Cloneable{
    public long id;

    public StudentInfo(long id) {
        this.id = id;
    }

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

class Student{
    public String name;

    public int age;
    
    public StudentInfo si;
    
    Student(String name, int age, StudentInfo si) {
        this.name = name;
        this.age = age;
        this.si = si;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        System.out.println("override clone");
        StudentInfo studentInfo = (StudentInfo) this.si.clone();
        return new Student(name, age, studentInfo);
    }
}

class TestClone {
    public static void main(String[] args) throws CloneNotSupportedException {
        System.out.println("----------------基本类型的复制-----------");
        // 基本类型,没有深浅复制,而且不能像c看到基本类型的地址
        int a1 = 1;
        int a2 = a1;
        a2 = 2;
        System.out.println(a1);
        System.out.println(a2);

        System.out.println("----------------对象的复制 1-----------");
        // 对象深浅复制
        // case 1: 当对象内部的变量都是基本类型
        StudentInfo s1 = new StudentInfo(18);
        StudentInfo s2 = (StudentInfo) s1.clone();
        StudentInfo s3 = s1;

        // 查看s[1...3]地址
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);

        // 修改学生信息2后,不影响
        s2.id = 20;
        System.out.println("id=" + s1.id );
        System.out.println("id=" + s2.id );

        // 修改学生信息3后,影响
        s3.id = 22;
        System.out.println("id=" + s1.id);
        System.out.println("id=" + s3.id);

        System.out.println("----------------对象的复制 2-----------");
        // case 2: 对象内容变量含有对象
        StudentInfo si = new StudentInfo(18);
        Student ss1 = new Student("张三", 18, si);
        // 进行深复制,需要重载clone方法
        Student ss2 = (Student) ss1.clone();
        Student ss3 = ss1;
        
        System.out.println(ss1);
        System.out.println(ss2);
        System.out.println(ss3);
        
        System.out.println(si + "            " + ss2.si);
        System.out.println(si!=ss2.si ? "深复制成功": "深复制失败");
    }
}


运行结果:
0
2
分享到:
评论
1 楼 duanduanlong 2012-05-11  
不错!写的不错呀

相关推荐

    JAVA API文档|JAVA API 1.7中文文档

    本篇将详细解读Java API 1.7中文版中的关键知识点。 首先,Java API 1.7,也被称为Java 7,是Java开发的一个重要版本。它引入了许多新特性,提升了开发效率和代码的可读性。以下是一些Java 7 API中的关键部分: 1....

    Java Speech API Programmers Guide

    以上就是对Java语音API程序员指南的详细知识点解读。通过这些内容,我们可以看出Java语音API作为一项历史较为悠久的技术,在Java生态中扮演了重要角色,为开发者提供了强大的语音交互功能。尽管文档中提及的某些细节...

    Java API函数大全

    本文将从给定的文档片段出发,详细解读其中提及的一些关键API概念及函数,帮助开发者们深入了解这些功能的具体应用及其背后的原理。 #### 1. 文件操作相关的API **1.1 CloseHandle** `CloseHandle` 函数用于关闭...

    F005_1 Filenet CE JAVA API.pdf

    标题:F005_1 Filenet CE JAVA API.pdf 描述与部分内客明确指出,这份文档是关于IBM FileNet Content Manager Java API编程的详细指南。以下是对标题、描述及部分展示内容中提及的关键知识点的深入解读: ### IBM ...

    Java面试指南.pdf

    2. Java核心API解读 - Object常用的方法:例如clone()用于对象复制,getClass()用于获取对象的运行时类等。 - String与StringBuffer的区别:String是不可变的,而StringBuffer是可变的,后者在字符串频繁修改时...

    kafka 数据可靠性深度解读.zip

    总的来说,Kafka的数据可靠性体现在其强大的复制机制、持久化存储、灵活的确认策略、事务支持以及Java API的易用性等方面。理解并掌握这些机制,对于在实际项目中使用Kafka保障数据安全和业务连续性至关重要。通过...

    Java中IO解读与使用实例-动力节点共17页.pdf

    本篇文章将详细解读Java IO,并通过实例深入理解其使用方法。 Java IO API提供了丰富的类和接口,使得开发者可以有效地与外部资源进行交互,包括文件、网络、内存缓冲区等。在Java的IO体系中,主要有两种流:字节流...

    2015Java面试指南

    - **Java实现浅克隆与深克隆**:浅克隆复制对象本身及含有引用的对象地址,而深克隆则复制了对象本身及所有成员变量的值。 - **枚举可以序列化吗**:枚举类型默认实现了`Serializable`接口,因此可以直接进行序列化...

    Java语言实战题演总计91道经典例题-金桥java软件工程师培训中心

    12. **JDBC**:Java Database Connectivity是Java访问数据库的标准API。掌握连接数据库、执行SQL、处理结果集等基本操作,是开发数据库应用的基础。 13. **设计模式**:23种设计模式是软件工程的最佳实践,如单例、...

    Java思维导图xmind文件+导出图片

    MongoDB可视化客户端及JavaApi实践 手写基于MongoDB的ORM框架 MongoDB企业级集解决方案 MongoDB聚合、索引及基本执行命令 MongoDB数据分片、转存及恢复策略 MyCat MySQL主从复制及读写分离实战 MySQL+...

    java面试宝典

    25. **Java实现浅克隆与深克隆**:浅克隆只复制对象的引用,深克隆会复制对象及其中的对象。 26. **枚举是否可以序列化**:可以。 27. **Java创建对象的方式**:包括new, clone, 序列化,反射等。 28. **能否自定义...

    java面试——广州-唯品会-Java大数据开发工程师.zip

    - **微服务架构**:理解服务拆分原则,API Gateway的设计,以及服务间的通信方式如RESTful API和gRPC。 - **负载均衡与缓存策略**:如Nginx的负载均衡配置,Redis的缓存设计,以及一致性哈希等缓存策略。 - **高...

    基于NetBeans开发的java应用程序集锦10

    以下是四个综合案例的详细解读,这些案例展示了NetBeans在实际开发中的应用和价值。 1. **多页面文本编辑器** 这个案例旨在创建一个具备多文档界面(MDI)的文本编辑器,用户可以在其中同时打开和编辑多个文本文件...

    java Util

    在阅读博客文章(链接已给出,但无法访问)时,可能涉及了更多关于Java Util的深入分析或源码解读,如类的实现原理、性能优化等。对于`util2`和`util`这两个文件,可能是示例代码或者自定义的工具类库,它们可以...

    Camstar API文档 (英文版,源码实例)

    本知识点将详细解读文档内容,概述Camstar Enterprise Platform™的相关技术细节,并提供一些关键知识点的深入解释。 首先,文档的标题和描述部分介绍了文档的版本、类型以及内容特点。文档是名为“Camstar ...

    达内it培训 java培训电子书 内部资料 系列22 JAVA企业面试题精选 pdf

    《JAVA企业面试题精选》是达内IT培训内部资料系列的一部分,主要针对Java开发者,特别是对准备参加Java企业面试的学员。这份电子书旨在帮助学习者深入理解和掌握Java核心技术,以便在实际面试中表现出色。以下将从多...

    Java 反编译工具

    4. 保存或复制代码:如果需要,可以将反编译的源代码保存到本地,或者直接复制部分代码用于参考。 需要注意的是,反编译的结果并不总是与原始源代码完全一致,因为字节码到源代码的过程是不可逆的,可能会丢失一些...

    java资源(pdf格式)

    7. **JDBC.pdf**:Java Database Connectivity(JDBC)是Java访问数据库的标准API。文档可能详细介绍了JDBC驱动的分类、连接数据库、执行SQL语句、结果集处理,以及事务管理和预编译语句。 8. **File and Stream....

Global site tag (gtag.js) - Google Analytics