値を渡すか参照するか
2622 ワード
public class A
{
public static void main(String args[]){
Person p1 = new Person("zhangshan",28);
Person p2 = new Person("lisi",27);
A a = new A();
a.changeObj(p1, p2);
System.out.println(p1.name + "__" + p2.name);
a.changeObj2(p1);
System.out.println(p1.name);
a.changeObj3(p2);
System.out.println(p2.name);
StringBuffer sb1 = new StringBuffer("s11111");
StringBuffer sb2 = new StringBuffer("s22222");
a.changeSB(sb1, sb2);
System.out.println(sb1 + "__" + sb2);
int x = 10;
int y = 100;
a.changeInt(x, y);
System.out.println(x + "__" + y); // ,copy
String s1 = "s1";
String s2 = "s2";
a.changeString(s1, s2);
System.out.println(s1 + "___" + s2);
}
public void changeObj(Person p1, Person p2){
Person temp = new Person("",0);
temp = p1;
p1 = p2;
p2 = temp;
}
public void changeObj2(Person p){
p.setName("test"); //changed
}
public void changeObj3(Person p){
p = new Person("test", 12); //no change ,p new , p2
}
public void changeSB(StringBuffer sb_1, StringBuffer sb_2){ //
sb_1.append("+appended"); //sb_1 sb1
sb_2 = sb_1; //sb_2 , sb1,sb_2 , sb2
}
public void changeInt(int a, int b){
int temp;
temp = a;
a = b;
b = temp;
}
public void changeString(String s_1, String s_2){
String temp;
temp = s_1;
s_1 = s_2;
s_2 = temp;
}
}
class Person
{
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
大体javaの基本データ型では、値伝達、すなわち実パラメータcopyが形パラメータに1部与えられ、形パラメータの変更には実パラメータに影響しません.
オブジェクト(文字列オブジェクトを含む)が伝達するアドレスである、実パラメータを変更すれば有効である.
ローカル変数やメンバー変数などはメモリのスタックに保存されており、newが出てくるのはスタックにあり、javaにはポインタがなく、これがポインタである.
ex:Peson p = new Person();
pはスタックの中にあり、newから出てきたPersonオブジェクトはスタックの中にあり、pはスタックの中のメモリアドレスに似たものを記録している.つまり、pを通じてPersopnオブジェクトにアクセスできるということだ.