[英]Passing objects to methods java
我正在使用三個對象: StringBuilder
, Integer
和testobject
- 它們被傳遞給一個方法來改變它的狀態。
正如所料, StringBuilder
和testobject
指向同一個對象,狀態發生了變化,但它不適用於Integer
對象。
class testobject{
int x = 1;
}
public class test{
public static void main(String[] args){
StringBuilder s1 = new StringBuilder("String");
go(s1);
System.out.println(s1);
Integer s2 = new Integer("20");
go1(s2);
System.out.println(s2);
testobject s3 = new testobject();
go2(s3);
System.out.println(s3.x);
}
static void go(StringBuilder s1){
s1.append("Builder");
}
static void go1(Integer s2){
s2 = 1;
}
static void go2(testobject s3){
s3.x = 5;
}
結果:
StringBuilder
20
5
預期結果:
StringBuilder
1
5
看看你的三種方法:
static void go(StringBuilder s1){
s1.append("Builder");
}
static void go1(Integer s2){
s2 = 1;
}
static void go2(testobject s3){
s3.x = 5;
}
在go
和go2
,您正在修改參數值所引用的對象。
在go1
,您正在更改參數變量本身的值。 這是非常不同的,因為Java總是使用pass-by-value ,調用者看不到這種變化。
重要的是要理解對象根本不會傳遞給方法。 相反,引用是。 s1
, s2
和s3
的值都是引用。 如果你覺得這些變量的像張紙,每張紙上有一所房子的地址,這是在宣布一張紙上復印main
。
go
和go2
的方法體就像訪問地址在紙上的房子,並在前門上畫畫。 如果您使用原始紙張訪問房屋,您仍然可以看到前門上的新顏色。
go1
的方法體就像go1
在紙上的地址,然后在那里寫一個新地址。 這不會改變房子,也不會改變原始的紙張。
如果要傳遞的參數是對象而不是基本類型,則Java將按對象傳遞視為按值傳遞,因為Java支持按值傳遞概念。
這里a和p是相同的參考:
public class ObjPass {
int value;
public static void main(String[] args) {
ObjPass p = new ObjPass();
p.value = 5;
System.out.println("Before calling: " + p.value);
increment(p);
System.out.println("After calling: " + p.value);
}
public static void increment(ObjPass a){
a.value++;
}
}
輸出:
Before calling: 5
After calling: 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.