zoukankan      html  css  js  c++  java
  • 理解(深)克隆


    首先,下面是一个不正确地使用了默认clone方法的类的示例:

     1package examples.cloning;
     2
     3/** An example class used to demonstrate what
     4  * happens when the default Object.clone method
     5  * is not overridden in a class with object
     6  * reference fields.
     7  */

     8public class IntArrayShared implements Cloneable {
     9
    10   private int[] a;
    11
    12   /** Class constructor method
    13     * @param size The maximum number of elements
    14     * @param initValue The initial value given
    15     */

    16   public IntArrayShared( int size, int initValue ) {
    17      a = new int[size];
    18      forint i=0; i < a.length; i++ ) {
    19         a[i] = initValue;
    20      }

    21   }

    22
    23   /** Obtain the value of an array element
    24     * @param index the array index of interest
    25     * @return the value at the specified index
    26     */

    27   public int elementAt( int index ) {
    28      return a[index];
    29   }

    30
    31   /** Set the value of an array element
    32     * @param index the array index to be updated
    33     * @param newValue the new value given
    34     */

    35   public void setValue( int index, int newValue ) {
    36      a[index] = newValue;
    37   }

    38
    39   /** Converts the object into a String
    40     * @return The value of the array as a String
    41     */

    42   public String toString() {
    43      StringBuffer sb = new StringBuffer( "" ); 
    44      forint i=0; i < a.length; i++ ) {
    45         sb.append( a[i] + " " );
    46      }

    47      return sb.append( "]" ).toString();
    48   }

    49
    50   /** The test method for the class
    51     * @param args Not used
    52     * @exception CloneNotSupportedException
    53     *            The inherited clone method may
    54     *            throw this exception
    55     */

    56   public static void main( String[] args ) 
    57            throws CloneNotSupportedException {
    58      IntArrayShared x = new IntArrayShared( 50 );
    59      IntArrayShared y = (IntArrayShared) x.clone();
    60      System.out.println( x );
    61      System.out.println( y );
    62
    63      x.setValue( 29999 );
    64      System.out.println( x );
    65      System.out.println( y );
    66   }

    67}

    结果如下:
    [ 0 0 0 0 0 ]
    [ 0 0 0 0 0 ]
    [ 0 0 9999 0 0 ]
    [ 0 0 9999 0 0 ]

    上面定义的引用域(是由整数构成的一个数组)不是不变的。因此,继承的Object.clone方法不能正确地克隆这个域。



    下面是一个正确改写clone方法的示例:

     1package examples.cloning;
     2
     3/** An example class used to demonstrate proper cloning
     4  * concepts
     5  */

     6public class IntArray implements Cloneable {
     7
     8   private int[] a;
     9
    10   /** Class constructor method
    11     * @param size The maximum number of elements
    12     * @param initValue The initial value given
    13     */

    14   public IntArray( int size, int initValue ) {
    15      a = new int[ size ];
    16      forint i=0; i<a.length; i++ ) {
    17         a[i] = initValue;
    18      }

    19   }

    20
    21   /** Obtain the value of an array element
    22     * @param index the array index of interest
    23     * @return the value at the specified index
    24     */

    25   public int elementAt( int index )
    26      return a[ index ]; }
    27
    28   /** Set the value of an array element
    29     * @param index the array index to be updated
    30     * @param newValue the new value given
    31     */

    32   public void setValue( int index, int newValue ) {
    33      a[ index ] = newValue;
    34   }

    35
    36   /** Convert the object to a String
    37     * @return The value of the array as a String
    38     *         object
    39     */

    40   public String toString() {
    41      StringBuffer sb = new StringBuffer( "" ); 
    42      forint i=0; i<a.length; i++ ) {
    43         sb.append( a[i] + " " );
    44      }

    45      return sb.append( "]" ).toString();
    46   }

    47
    48   /** Provide a clone method specifically for the
    49     * IntArray class
    50     * @exception CloneNotSupportedException
    51     *            Superclass may throw this
    52     * @return A clone of the object
    53     */

    54   public Object clone()
    55         throws CloneNotSupportedException {
    56      IntArray newObject = (IntArray)super.clone();
    57      newObject.a = (int[])a.clone();
    58      return newObject;
    59   }

    60
    61   /** The test method for the class
    62     * @param args Not used
    63     * @exception CloneNotSupportedException
    64     *            The overiding clone method may
    65     *            throw this
    66     */

    67   public static void main( String[] args ) 
    68         throws CloneNotSupportedException {
    69      IntArray x = new IntArray( 50 );
    70      IntArray y = (IntArray)x.clone();
    71      System.out.println( x );
    72      System.out.println( y );
    73
    74      x.setValue( 29999 );
    75      System.out.println( x );
    76      System.out.println( y );
    77   }

    78}

    结果如下:
    [ 0 0 0 0 0 ]
    [ 0 0 0 0 0 ]
    [ 0 0 9999 0 0 ]
    [ 0 0 0 0 0 ]



    希望我的这两个例子可以更好地帮助大家理解clone。

  • 相关阅读:
    sublime去除空白行和重复行
    python list删除数据 和复制 列表
    微博实现简繁体转换
    2017.10.27日面试总结
    python 类和__class__理解
    python 单例模式应用
    pt-query-digest 慢日志监控
    在线安全清空慢查询日志slowlog
    Linux高级系统恢复技术
    灾备演练
  • 原文地址:https://www.cnblogs.com/bankey/p/356309.html
Copyright © 2011-2022 走看看