首先要說明的是java中是沒有指針的寝志,java中只存在值傳遞丈咐,只存在值傳遞!2芴А! 然而我們經(jīng)臣宾看到對于對象(數(shù)組沐祷,類,接口)的傳遞似乎有點像引用傳遞攒岛,可以改變對象中某個屬性的值赖临。但是不要被這個假象所蒙蔽,實際上這個傳入函數(shù)的值是對象引用的拷貝灾锯,即傳遞的是引用的地址值兢榨,所以還是按值傳遞。
示例1:
public class Test3 {
public static void change(int a){
a=50;
}
public static void main(String[] args) {
int a=10;
System.out.println(a);
change(a);
System.out.println(a);
}
}
很顯然輸出的 是10顺饮,10吵聪。傳遞的是值得一份拷貝,這份拷貝與原來的值沒什么關(guān)系兼雄。
內(nèi)存分析:
示例2:
public class Test3 {
public static void change(int []a){
a[0]=50;
}
public static void main(String[] args) {
int []a={10,20};
System.out.println(a[0]);
change(a);
System.out.println(a[0]);
}
}
輸出為:10 50
內(nèi)存分析:
示例3:
class Emp {
public int age;
}
public class Test {
public static void change(Emp emp)
{
emp.age = 50;
emp = new Emp();//再創(chuàng)建一個對象
emp.age=10000;
}
public static void main(String[] args) {
Emp emp = new Emp();
emp.age = 100;
System.out.println(emp.age);
change(emp);
System.out.println(emp.age);
}
}
輸出為:100 50
內(nèi)存分析:
示例4:
public class Test {
public static void change(String str){
str="zhangsan";
}
public static void main(String[] args) {
String s=new String("lisi");
System.out.println(s);
change(s);
System.out.println(s);
}
}
輸出為:lisi lisi
分析:在change方法中傳入的應(yīng)該是字符串s地址的拷貝吟逝,即str與s保存的是同一個字符串“l(fā)isi”的地址,而在方法里str=“zhangsan”這一句相當(dāng)于在堆內(nèi)存中創(chuàng)建了一個“zhangsan”并且使str指向字符串“zhangsan”的地址赦肋,所以輸出的s還是lisi块攒。如果使用StringBuffer對象傳遞励稳,并調(diào)用它的方法(而不是new一個新的StringBuffer),是可以修改的囱井。