java參數的傳遞方式有兩種:值傳遞和引用傳遞
值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,實參和形參是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。
引用傳遞:(形式參數類型是引用數據類型參數):也稱爲傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。
補充:java中基本數據類型和引用數據類型
基本數據類型 | 大小 | 範圍 | 默認值 |
int(整形) | 32 | -2147483648~2147483648 | 0 |
long(長整形) | 64 | -9233372036854477808~9233372036854477808 | 0 |
float(浮點形) | 32 | -3.40292347E+38~3.40292347E+38 | 0.0f |
double(雙精度) | 64 | -1.79769313486231570E+308~1.79769313486231570E+308 | 0.0d |
short(短整型) | 16 | -32768~32768 | 0 |
boolean(布爾型) | 1 | true/false | false |
char(字符型) | 16 | ‘ \u0000 - u\ffff ’ | ‘\u0000 ’ |
byte(字節型) | 8 | -128~127 | 0 |
基本數據類型在被創建時,在棧上給其劃分一塊內存,將數值直接存儲在棧上;
引用數據類型在被創建時,首先要在棧上給其引用(句柄)分配一塊內存,而對象的具體信息都存儲在堆內存上,然後由棧上面的引用指向堆中對象的地址。
例如,有一個類Person,有屬性name,age,帶有參的構造方法,
Person p = new Person("Tom",20);
在內存中的具體創建過程是:
1.首先在棧內存中位其p分配一塊空間;
2.在堆內存中爲Person對象分配一塊空間,併爲其三個屬性設初值"",0;
3.根據類Person中對屬性的定義,爲該對象的兩個屬性進行賦值操作;
4.調用構造方法,爲兩個屬性賦值爲"Tom",20;(注意這個時候p與Person對象之間還沒有建立聯繫);
5.將Person對象在堆內存中的地址,賦值給棧中的p;通過句柄p可以找到堆中對象的具體信息。
基本數據類型 | 大小 | 範圍 | 默認值 |
int(整形) | 32 | -2147483648~2147483648 | 0 |
long(長整形) | 64 | -9233372036854477808~9233372036854477808 | 0 |
float(浮點形) | 32 | -3.40292347E+38~3.40292347E+38 | 0.0f |
double(雙精度) | 64 | -1.79769313486231570E+308~1.79769313486231570E+308 | 0.0d |
short(短整型) | 16 | -32768~32768 | 0 |
boolean(布爾型) | 1 | true/false | false |
char(字符型) | 16 | ‘ \u0000 - u\ffff ’ | ‘\u0000 ’ |
byte(字節型) | 8 | -128~127 | 0 |
基本數據類型在被創建時,在棧上給其劃分一塊內存,將數值直接存儲在棧上;
引用數據類型在被創建時,首先要在棧上給其引用(句柄)分配一塊內存,而對象的具體信息都存儲在堆內存上,然後由棧上面的引用指向堆中對象的地址。
例如,有一個類Person,有屬性name,age,帶有參的構造方法,
Person p = new Person("Tom",20);
在內存中的具體創建過程是:
1.首先在棧內存中位其p分配一塊空間;
2.在堆內存中爲Person對象分配一塊空間,併爲其三個屬性設初值"",0;
3.根據類Person中對屬性的定義,爲該對象的兩個屬性進行賦值操作;
4.調用構造方法,爲兩個屬性賦值爲"Tom",20;(注意這個時候p與Person對象之間還沒有建立聯繫);
5.將Person對象在堆內存中的地址,賦值給棧中的p;通過句柄p可以找到堆中對象的具體信息。