zoukankan      html  css  js  c++  java
  • cloneable以及深拷贝和浅拷贝

    Objec类有11个方法,有两个protected的方法,其中一个为clone方法(另一个为finalize)。

    该方法的签名是:

    protected native Object clone() throws CloneNotSupportedException;

    因为每个类直接或间接的父类都是Object,因此它们都含有clone()方法,但是因为该方法是protected,所以都不能在类外进行访问。

    要想对一个对象进行复制,就需要对clone方法覆盖。

    一般步骤是(浅复制):

    1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常) 该接口为标记接口(不含任何方法)

    2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对,(native为本地方法)

    jdk的集合类clone()方法默认实现为浅拷贝

    如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,重写clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份 , 这就要求这个成员变量对象必须也要实现Cloneable接口,并且重写clone方法。对于超过两层嵌套的情况,则要所有成员变量都递归的实现clone方法才能实现完全的深拷贝。

    应用:

    不可变类:线程安全

    不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。
    可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。

    不可变类遵守如下原则:

    1、使用private和final修饰符来修饰该类的属性

    2、提供带参数的构造器,用于根据传入的参数来初始化属性。

    3、仅为该类属性提供getter方法,不要提供setter方法。

    4、如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。}

    通过构造器初始化所有成员,进行深拷贝(deep copy)

    如果构造器传入的对象直接赋值给成员变量,还是可以通过对传入对象的修改进而导致改变内部变量的值。

  • 相关阅读:
    poj1417(带权并查集+背包DP+路径回溯)
    poj1182(带权并查集)
    hdoj3038(带权并查集)
    poj1611(并查集简单应用)
    poj2236(并查集)
    莫队板子,例题
    离散化二维坐标
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    树链剖分板子
    P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)
  • 原文地址:https://www.cnblogs.com/heapStark/p/8150908.html
Copyright © 2011-2022 走看看