Java裏的clone方法

Java語言的一個優點就是取消了指針的概念,但也導致了許多程序員在編程中常常忽略了對象與引用的區別,特別是先學c、c++後學java的程序員。並且由於 Java不能通過簡單的賦值來解決對象複製的問題,在開發過程中,也常常要要應用clone()方法來複製對象。比如函數參數類型是自定義的類時,此時便是引用傳遞而不是值傳遞。以下是爲大家分享的'Java裏的clone方法,供大家參考借鑑,歡迎瀏覽!

Java裏的clone方法

  以下是一個小例子:

1

2

3

public class A {

public String name;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class testClone {

public void changeA(A a){

="b";

}

public void changInt(int i){

i=i*2+100;

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

testClone test=new testClone();

A a=new A();

="a";

tln("before change : ="+);

geA(a);

tln("after change : ="+);

int i=1;

tln("before change : i="+i);

gInt(i);

tln("after change : i="+i);

}

此時輸出的結果是:

before change : =a

after change : =b

before change : i=1

after change : i=1

從這個例子知道Java對對象和基本的數據類型的處理是不一樣的。在Java中用對象的作爲入口參數的傳遞則缺省爲"引用傳遞",也就是說僅僅傳遞了對象的一個"引用",這個"引用"的概念同C語言中的指針引用是一樣的。當函數體內部對輸入變量改變時,實質上就是在對這個對象的直接操作。

除了在函數傳值的時候是"引用傳遞",在任何用"="向對象變量賦值的時候都是"引用傳遞",如:

1

2

3

4

5

6

7

A a1=new A();

A a2=new A();

="a1";

a2=a1;

="a2";

tln("="+);

tln("="+)

 此時輸出的結果是:

=a2

=a2

如果我們要用a2保存a1對象的數據,但又不希望a2對象數據被改變時不影響到a1。實現clone()方法是其一種最簡單,也是最高效的手段。

下面我們來實現A的clone方法

1

2

3

4

5

6

7

8

9

10

11

12

13

public class A implements Cloneable {

public String name;

public Object clone() {

A o = null;

try {

o = (A) e();

} catch (CloneNotSupportedException e) {

tStackTrace();

}

return o;

}

}

首先要實現Cloneable接口,然後在重載clone方法,最後在clone()方法中調用了e(),這也意味着無論clone類的繼承結構是什麼樣的,e()直接或間接調用了ct類的clone()方法。

1

2

3

4

5

6

7

A a1=new A();

A a2=new A();

="a1";

a2=(A)e();

="a2";

tln("="+);

tln("="+);

 此時輸出的結果是:

=a1

=a2