java中的參數傳遞是值傳遞!值傳遞!!值傳遞!!!

之前一直看到一個概念,面試題中也總是頻頻出現: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,就總結了一下,希望有所幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章