標籤:java值傳遞
只有在方法調用的時候才涉及到值傳遞的概念!Java中進行方法調用的時候傳遞參數時,遵循值傳遞的原則:1)基礎資料型別 (Elementary Data Type),傳遞的是資料的拷貝2)引用資料類型,傳遞的是傳遞的引用地址的拷貝,而不是該對象本身樓主的問題涉及到的內容太多,首先理解以下概念形參:方法聲明時的參數變數,用於接收調用方法時傳過來的實參如:void f(int i){} 或 void f(String s){}實參:方法調用時實際傳過去的內容,用於給形參賦值如:f(1) 或 f("abc")變數按不同的資料類型分為2類:1)基礎資料型別 (Elementary Data Type)變數:4類8種基本類型,byte,short,char,int,long,float,double,boolean如:int i = 0;2)引用資料類型變數: 類,介面,數組如:String s = "abc";注意:Java中除了4類8種基礎資料型別 (Elementary Data Type)以外全部是引用資料類型變數按聲明的位置不同分為2類:1)成員變數:方法外部,類內部聲明的變數2)局部變數:方法內部聲明的變數,形參屬於局部變數變數的初始化:1)成員變數:如果不顯示對其初始化,那麼Java採用預設值對其進行初始化2)局部變數:不賦值,就不能使用看來樓主對引用和對象的概念還不是特別瞭解,執行中的記憶體管理:不同的作業系統不太一樣,但一般記憶體都分為4個地區:1)heap(堆):存放new出來的對象2)stack(棧):存放局部變數3)data segment(資料區):靜態變數 和 字串常量4)code segment(代碼區):存放代碼 例子:public class Test {void f(int j) {System.out.println(j);}void ff(String ss) {System.out.println(ss);}public static void main(Stirng[] args) {int i = 100;String s = "hello";Test t = new Test();t.f(i);t.ff(s);}}當mian方法開始執行的時候int i = 100; 棧中分配一塊空間,存放變數i,值為100,基礎資料型別 (Elementary Data Type)只佔一塊空間String s = "hello"; "hello"是字串常量,分配在data區,字串常量為String類的一個對象,s指向了這個"hello"對象,這就是引用資料類型,在記憶體中佔兩塊空間,有點形象思維:一提參考型別,就是一塊記憶體指向另一塊記憶體s可以被叫做:引用、引用變數、引用地址,其實s就是一個指標,在這裡不用鑽牛角尖,你就知道s是一個引用,s的值是一個地址,根據這個地址就可以找到一個對象就ok了,Test t = new Test(); 同理,棧中的引用t指向了堆中new出來的這個Test對象Java中進行方法調用的時候傳遞參數時,遵循值傳遞的原則:1)基礎資料型別 (Elementary Data Type),傳遞的是資料的拷貝2)引用資料類型,傳遞的是傳遞的引用地址的拷貝,而不是該對象本身t.f(i);方法的形參屬於局部變數,所以在調用f方法的時候,棧記憶體配置一個int型的變數j,將i的值當做實參傳遞過去,i的值是100,現在將100拷貝給了j,那麼j的值就是100,這就是樓主說的“值傳遞”,接著列印,最後方法結束,為該方法分配的局部變數立刻全部清空,那麼Stack中這個j消失了t.ff(s);調用ff方法的時候,棧記憶體配置一個String型的變數ss,將s的值當做實參傳遞過去,s指向了"hello"對象,s的值是一個地址,現在將這個地址拷貝給了ss,那麼ss也就指向這個"hello"了這就是樓主說的"引用傳遞",現在s 和 ss 兩個引用 同時指向了"hello"對象,然後列印ss,最後方法結束,棧中這個ss被清除現在main方法執行結束,為main方法分類的局部變數清除,i,s,t全部消失,data區的符串常量"hello"和堆記憶體的Test對象,由於沒有任何引用指向他們了,就會被垃圾收集器回收累死我了..
Java的值傳遞說明