java傳值與傳引用問題總結

2021-07-16 02:37:21 字數 2114 閱讀 1285

1.基本型別與引用型別區別

對於基本型別(int , long , short , double , char , byte , float , boolean ),變數直接儲存資料的值;

對於引用型別,變數儲存的是物件的位址,由此位址指向實際物件。如圖:

對於基本型別,直接傳值,方法裡進行重新賦值不會導致原值改變:

public

class test

public

static

void

main(string args)

}

輸出:0

public

class test

public

static

void

main(string args)

}

輸出:hello

string是引用型別,按理說應該方法中的值會改變原來的值,但是這裡輸出的是hello。因為string這種引用型別比較特殊,其實傳入方法的是乙個副本,不管方法內怎麼改變string的值,都是使副本指向了這個string 值。

main方法內的n一開始指向的是hello這塊資料,呼叫change方法時,傳入的是n的乙個副本,相當於重新new 乙個string,所以對其的操作並不會對外面的n造成影響。

2.陣列

public

class test

public

static

void

main(string args) ; // 陣列

int ii = ;// 陣列

change(c,ii);

system.out.println(c[0] + " " + ii[0]);}}

輸出:g 8

陣列也是引用型別,傳入的是引用,在方法內操作會改變原始值。

3.對於物件

public

class test

public

static

void

main(string args)

}class student

輸出: lisi

物件是引用型別,會改變原始值~

再看個例子:

public

class test

public

static

void

main(string args)

}class student

輸出: zhangsan

這個傳入的雖然是引用型別,但方法內部改變了原物件的指向,方法內操作的相當於乙個新的物件。所以不會改變原物件的屬性。

傳入時,方法內s 跟main方法內的s都是指向zhangsan,當change方法裡面重新new 乙個student並賦值後,change方法裡的s已經指向了乙個新的物件,main方法裡還是指向原來的物件,並不會因為change方法裡的操作做任何改變。

最後乙個:

public

class test

public

static

void

main(string args)

}class student

輸出: lisi

這個例子相比上個例子就是將student的name屬性變成了static,全域性變數了,這樣即使在change方法內重新new了乙個物件,指向不同,也還是會改變這個屬性的,道理很簡單, 全域性變數啊!

傳值與傳引用

python的函式傳值和傳引用,和c c 語言是一樣的。在開始之前,我們有必要分清一下python的一些基礎概念。首先要說的是 變數 與 物件 在python中,型別屬於物件,變數是沒有型別的,這正是python的語言特性,也是吸引著很多pythoner的一點。所有的變數都可以理解是記憶體中乙個物件...

java引數傳值 傳引用

1 結論 2 傳值和傳引用區別 例項1 傳值 void method1 7 void method2 13 voidchange1 stringbuffer sb 17 voidchange2 stringbuffer sb 呼叫method1 螢幕列印結果為 helloworld 呼叫method...

傳值傳引用的問題

include include include include nicai.h include using namespace std class fer private int fengzi int c int fengmu public void setnumber fer we void ad...