之前一直看到一個概念,面試題中也總是頻頻出現:java中的參數傳遞是值傳遞還是引用傳遞?答:值傳遞。
先從基本類型入手:
public class ChangePoint{
public static void main(String[] args) {
String aa="123";
String bb=new String("456");
rePoint(aa,bb);
System.out.println(aa);//123
System.out.println(bb);//456
rePoint2(aa,bb);
System.out.println(aa);//123
System.out.println(bb);//456
int i=12;
rePoint(i);
System.out.println(i);//12
}
/**
* 改變整數別名的指向
* @param i
*/
public static void rePoint(int i){
i=13;
}
/**
* 改變字符型別名的指向,指向常量字符串
* @param aa
* @param bb
*/
public static void rePoint(String aa,String bb){
aa="777";
bb="888";
}
/**
* 改變字符型別名的指向,指向字符串對象
* @param aa
* @param bb
*/
public static void rePoint2(String aa,String bb){
aa=new String("999");
bb=new String("000");
}
}
可以看到,無論是字符常量還是對象,只要是在方法中改變值的,都不能將值傳遞到方法外。
我們將實例換成對象:
public class TestBean {
private String name;
private String age;
public TestBean(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "TestBean [name=" + name + ", age=" + age + "]";
}
}
現在我們對這個bean做測試:
public class Properties {
public static void main(String[] args) {
TestBean bean=new TestBean("bob", "11");
rePoint(bean);
System.out.println(bean.toString());//TestBean [name=bob, age=11]
reField(bean);
System.out.println(bean.toString());//TestBean [name=anotherBob, age=11]
}
/**
* 改變bean的引用指向
* @param bean
*/
public static void rePoint(TestBean bean){
TestBean bean2=new TestBean("tom", "12");
bean=bean2;
}
/**
* 改變bean的域指向
* @param bean
*/
public static void reField(TestBean bean){
bean.setName("anotherBob");
}
}
可以看到,當我們直接改變對象引用的指向,方法外的引用並沒有改變;而當我們通過這個引用操作對象中的域的時候,對象是改變了的;下面總結一下結論:
方法中參數實際上是原對象引用的一份拷貝,當我們對方法中的引用指向令外一個對象時,實際是將拷貝出來的地址指向另外一個對象:
因此,我們在方法內對參數的賦值,只是對拷貝的地址進行賦值;
那爲什麼改變參數指向的對象時,對象改變了?
方法結束,拷貝的地址被銷燬,但是對象不會銷燬,因此,方法外的對象真實的發生了變法。
總結
java方法中參數的傳遞是值傳遞。只是有些人喜歡叫它引用傳遞而已。最近看到項目中代碼出現這個bug,由於對象沒有正確返回,出現了大量nullPointerException,就總結了一下,希望有所幫助