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一份给形参,对于形参的任何改变不会影响实参
如果是对象(包括字符串对象),都是传递的地址,如果对实参做出了改变,那就是有效的.
局部变量和成员变量之类都是保存在内存的栈(stack)中,new出来的都是在堆中(heap),java中没有指针,都是这个其实就是指针.
ex:Peson p = new Person();
p位于栈中,new出来的Person对象在堆中,p记录的是一串类似 于堆中内存地址的东西,就是说可以通过p来访问Persopn对象