關於java中的“引用”概念
阿新 • • 發佈:2018-08-10
ref 討論 引用 stub 前言 clas 中一 按值傳遞 基本
前言
最近在閱讀《java編程思想》一書時,對作者關於java中的”引用(句柄)“的解釋不太清楚,因此以實驗的方式來討論下java中一切皆”按值傳遞“這一說法,從而加深理解。
正文
情景一:當參數為基本數據類型(如:int)時
public class TestReference { public static void testOne(int i){ i = 2; System.out.println("test函數中的變量值:" + i); } public static void main(String[] args) { // TODO Auto-generated method stub int a = 1; TestReference.testOne(a); System.out.println("main函數中的變量值:" + a); } }
運行結果:
test函數中的變量值:2
main函數中的變量值:1
由此可見:當參數為基本數據類型時,參數的傳遞為按值的拷貝傳遞
情景二:當參數為對象時,出現“按引用傳遞”的效果
package test; public class TestReference { public static void testTwo(B c){ c.data = 2; System.out.println("test函數中的變量值:" + c.data); } public static void main(String[] args) { // TODO Auto-generated method stub B b = new B(); b.data = 1; TestReference.testTwo(b); System.out.println("main函數中的變量值:" + b.data); } }
運行結果:
test函數中的變量值:2
main函數中的變量值:2
由此可見:此例中函數的參數確實以拷貝地址的方式操作了實參變量。
情景三: 函數中對參數創建新的對象
public class TestReference { public static void testThree(String str){ str = new String("new"); System.out.println("test函數中的變量值:" + str); } public static void main(String[] args) { // TODO Auto-generated method stub String str = new String("old"); TestReference.testThree(str); System.out.println("main函數中的變量值:" + str); } }
運行結果:
test函數中的變量值:new
main函數中的變量值:old
由此可見:實參變量以拷貝地址的方式將對象地址傳遞給了形參變量,但在函數運行過程中,形參變量被賦予的新的對象的地址,因此此後對形參變量的操作與實參變量便不再有關系。
總結
所謂“一切皆傳值”對於基本數據類型,指的便是變量值得拷貝,而對於對象(或String、Integer等包裝基本類型),指的是對象地址的拷貝,也就是說所傳遞的值是對象的地址。
關於java中的“引用”概念