zoukankan      html  css  js  c++  java
  • java基础之 clone

    参考文档:
    深拷贝&浅拷贝:http://blog.csdn.net/cws1214/article/details/52193341

    克隆的分类:
      (1)浅克隆(shallow clone),浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。
      (2)深克隆(deep clone),深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。

    克隆的实现:
      1. 让该类实现java.lang.Cloneable接口;
      2. 重写(override)Object类的clone()方法。
    (该方法是浅克隆,如果需要实现深克隆,则需要重写clone方法)

    clone()满足的条件:
     clone()方法将对象复制了一份并返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的。一般而言,clone()方法满足以下的描述:
      (1)对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。
      (2)对任何的对象x,都有:x.clone().getClass() == x.getClass(),换言之,克隆对象与原对象的类型一样。
      (3)如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。
      在JAVA语言的API中,凡是提供了clone()方法的类,都满足上面的这些条件。JAVA语言的设计师在设计自己的clone()方法时,也应当遵守着三个条件。一般来说,上面的三个条件中的前两个是必需的,而第三个是可选的。

    为什么Object类的clone()方法是浅拷贝:

    1. 效率和简单性,简单的copy一个对象在堆上的的内存比遍历一个对象网然后内存深copy明显效率高并且简单
    2. 不给别的类强加意义。如果A实现了Cloneable,同时有一个引用指向B,如果直接复制内存进行深copy的话,意味着B在意义上也是支持Clone的,但是这个是在使用B的A中做的,B甚至都不知道。破坏了B原有的接口
    3. 有可能破坏语义。如果A实现了Cloneable,同时有一个引用指向B,该B实现为单例模式,如果直接复制内存进行深copy的话,破坏了B的单例模式
    4. 更灵活,如果A引用一个不可变对象,则内存deep copy是一种浪费。Shadow copy给了程序员更好的灵活性。

    创建对象的几种方式:

    • new:new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕
    • 反射

       a:Student  stu = (Student)Class.forName("根路径.Student").newInstance()
       b:Student stu = Student.class.newInstance()
    区别:
      > Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
      > Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
      > Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。

    • clone

           先分配内存,将原来对象内存里的内容copy一份。不会调用构造方法

    • 反序列化



  • 相关阅读:
    章节八、2-火狐的插件TryXPath
    章节八、1-如何使用火狐开发者工具来查找元素
    章节七、6-Map集合的区别
    章节七、5-Maps
    章节七、4-Sets
    章节七、3-ArrayList和LinkedList对比
    章节七、2-Linked List
    jQuery中$符号的作用
    jQuery基础的HTML与text区别
    推荐一些github上的免费好书
  • 原文地址:https://www.cnblogs.com/amei0/p/8442183.html
Copyright © 2011-2022 走看看