Java中參數(shù)傳遞類型只有值傳遞
Java核心技術(shù)卷I里有一個(gè)結(jié)論我覺(jué)得挺有意思的:java中沒(méi)有引用傳遞,只有值傳遞
首先看定義:
值傳遞,是指方法接收的是調(diào)用者提供的值
引用傳遞,是指方法接收的是調(diào)用者提供的變量地址
以前學(xué)習(xí)C++時(shí)把參數(shù)傳遞分為值傳遞和引用傳遞,國(guó)內(nèi)的不少java教材愿意把對(duì)象的傳遞理解是引用傳遞,為什么它們會(huì)這么說(shuō)呢?可以看下面一個(gè)例子:
- import java.util.Calendar;
- public class ChangeValue {
- public static void main(String[] args) {
- Calendar oc = Calendar.getInstance();
- System.out.println("origin:"+oc.getTime());
- changeDate(oc);
- System.out.println("after:"+oc.getTime());
- }
- static void changeDate(Calendar pd){
- pd.set(1970, 1, 1);
- }
- }
某時(shí)刻程序輸出:
origin:Thu Jan 05 21:15:59 CST 2012 after:Sun Feb 01 21:15:59 CST 1970
oc對(duì)象的值改變了,很多人就認(rèn)為java對(duì)象傳遞實(shí)際上是引用傳遞。
過(guò)程應(yīng)該是這樣的:
運(yùn)行changeDate這個(gè)函數(shù)時(shí),方法得到的是對(duì)象引用的拷貝,oc和pd同時(shí)引用同一個(gè)對(duì)象,所以函數(shù)運(yùn)行結(jié)束后,pd已經(jīng)消失了,但是對(duì)引用對(duì)象的更改卻也影響了oc所引用的同一對(duì)象,結(jié)合對(duì)之前的定義理解,這應(yīng)該是值傳遞的過(guò)程(傳遞的是對(duì)象引用的拷貝)。
以下附上另一個(gè)例子,兩個(gè)對(duì)象的交換函數(shù)(C++中可以輕易實(shí)現(xiàn)):
- public class Swap {
- public static void main(String[] args) {
- ObjectSample o1 = new ObjectSample("hello");
- ObjectSample o2 = new ObjectSample("你好");
- System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());
- Swap.swapObject(o1, o2);
- System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());
- }
- static void swapObject(ObjectSample o1, ObjectSample o2){
- ObjectSample temp = new ObjectSample("temp");
- temp = o1;
- o1 = o2;
- o2 = temp;
- }
- }
- class ObjectSample{
- private String title;
- ObjectSample(String title){
- this.title = title;
- }
- public String getTitle(){
- return title;
- }
- }
輸出結(jié)果:
before swap o1:hello o2:你好 after swap o1:hello o2:你好
java在交換程序中并沒(méi)有交換兩個(gè)對(duì)象的值,交換的是兩個(gè)對(duì)象的拷貝,不能實(shí)現(xiàn)讓對(duì)象參數(shù)引用一個(gè)新對(duì)象,究其原因還是因?yàn)閖ava是采用了值傳遞而非引用傳遞。
還有不少和以前自己接觸的觀點(diǎn)不一樣的地方,當(dāng)然需要借鑒的吸收并且經(jīng)過(guò)自己的實(shí)踐來(lái)辨別。
原文鏈接:http://tjuking.iteye.com/blog/1405532
【編輯推薦】




























