日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 克隆的作用_关于java中克隆的学习(一)

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 克隆的作用_关于java中克隆的学习(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java中的克隆,就是要復制對象,但為什么要用克隆呢?我們直接把對象賦值給其它同類型的實例不就行了嗎?這就要從java的值傳遞和引用傳遞說起了。

package dcr.study.test.pointer;

public class Obj {

String str = "init value";

public String toString() {

return str;

}

}

測試值傳遞和引用傳遞的代碼如下:(注:注釋中說明了代碼的作用)

package dcr.study.test.pointer;

import java.util.Enumeration;

import java.util.Hashtable;

/*

*

* */

public class ObjRef {

Obj aObj = new Obj();

int aInt = 11;

public void changeObj(Obj inObj) {

inObj.str = "changed value";

}

public void changePri(int inInt) {

inInt = 22;

}

public static void main(String[] args) {

ObjRef oRef = new ObjRef();

System.out.println("Before call changeObj() method: " + oRef.aObj);

oRef.changeObj(oRef.aObj);

System.out.println("After call changeObj() method: " + oRef.aObj);

System.out.println("==================Print Primtive=================");

System.out.println("Before call changePri() method: " + oRef.aInt);

oRef.changePri(oRef.aInt);

System.out.println("After call changePri() method: " + oRef.aInt);

/*

* 運行結果如下 Before call changeObj() method: init value After call changeObj()

* method: changed value ==================Print Primtive=================

* Before call changePri() method: 11 After call changePri() method: 11

*

* 方法changeObj(Obj inObj);和方法changePri(int inInt);都是去改變傳入的參數值,

* 不同的是changeObj(Obj inObj);方法傳過的是一個對象,而changePri(int inInt);

* 方法傳入的卻是java的基本類型int,雖然兩個方法做了類似的事,但是結果卻不一樣,傳對象

* 的方法值被改掉了,但是傳java基本類型的方法,值還是原來的值。

* 原因是java參數的傳遞分為兩種,值傳遞和引用傳遞(不光是java其它語言也一樣)。

* 值傳遞:在java中以 基本類型 和 基本類型的包裝類

* 做為參數時,都是值傳遞。 引用傳遞:以對象做為參數時為引用傳遞。

*

*/

System.out.println("==================引用傳遞=================");

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

ObjRef oRefA = new ObjRef();

ObjRef oRefB = oRefA;

oRefA.aObj.str = "改變oRefA的Obj實例的值";

System.out.println("Print objB.str value: " + oRefB.aObj.str);

// 此處我們只改變了oRefA 的 Obj實例的str的值,但是oRefB的Obj實例的str的值同時也變了。

// 說明了在使用 “=” 號向對象變量賦值的時候,也是使用了“引用傳遞“。

System.out.println("=============引用傳遞導致的麻煩=============");

// 下面是關于HashTable的一個例子,HashTable真的能存儲對象嗎?

Hashtable ht = new Hashtable();

StringBuilder sb = new StringBuilder();

sb.append("abc");

ht.put(1, sb);

sb.append("def");

ht.put(2, sb);

sb.append("ghi");

ht.put(3, sb);

sb.append("xyz");

ht.put(4, sb);

int numObj = 0;

Enumeration it = ht.elements();

while (it.hasMoreElements()) {

System.out.print("get StringBufffer " + (++numObj)

+ " from Hashtable: ");

System.out.println(it.nextElement());

}

/*

運行結果如下:

=============引用傳遞導致的麻煩=============

get StringBufffer 1 from Hashtable: abcdefghixyz

get StringBufffer 2 from Hashtable: abcdefghixyz

get StringBufffer 3 from Hashtable: abcdefghixyz

get StringBufffer 4 from Hashtable: abcdefghixyz

而不是我們期望的

=============引用傳遞導致的麻煩=============

get StringBufffer 1 from Hashtable: abcdefghixyz

get StringBufffer 2 from Hashtable: abcdefghi

get StringBufffer 3 from Hashtable: abcdef

get StringBufffer 4 from Hashtable: abc

原因就是引用的傳遞

如果在向Hashtable put的時候在 sb的后面加上toString()方法,則可以得到

我們想要的結果。如:ht.put(1,sb.toString());因為java中基本類型和

基本類型的包裝類都是值傳遞。

*/

}

}

分享到:

2009-05-26 10:53

瀏覽 757

評論

總結

以上是生活随笔為你收集整理的java 克隆的作用_关于java中克隆的学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。