首先,下面是一个不正确地使用了默认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 for( int 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 for( int 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( 5, 0 );
59 IntArrayShared y = (IntArrayShared) x.clone();
60 System.out.println( x );
61 System.out.println( y );
62
63 x.setValue( 2, 9999 );
64 System.out.println( x );
65 System.out.println( y );
66 }
67}
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 for( int 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 for( int 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( 5, 0 );
59 IntArrayShared y = (IntArrayShared) x.clone();
60 System.out.println( x );
61 System.out.println( y );
62
63 x.setValue( 2, 9999 );
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 for( int 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 for( int 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( 5, 0 );
70 IntArray y = (IntArray)x.clone();
71 System.out.println( x );
72 System.out.println( y );
73
74 x.setValue( 2, 9999 );
75 System.out.println( x );
76 System.out.println( y );
77 }
78}
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 for( int 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 for( int 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( 5, 0 );
70 IntArray y = (IntArray)x.clone();
71 System.out.println( x );
72 System.out.println( y );
73
74 x.setValue( 2, 9999 );
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。