程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java參數傳遞機制,java參數傳遞

java參數傳遞機制,java參數傳遞

編輯:JAVA綜合教程

java參數傳遞機制,java參數傳遞


  java的參數傳遞機制和C、C++其實很像,前兩天在改一個網站異步接口的時候,掉入坑裡,之前是外包寫的代碼,springMVC裡起了一個多線程,但是參數傳遞的時候傳的是一個model對象,所以所有線程都共用了這個對象,結果跑出來的result一塌糊塗。

  下面進入正題,先看一段demo代碼吧

public class Model {

	private int value;
	
	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
}



public class Demo {

	public static void main(String[] args) {
		String str = "str";
		int i = 1;
		Model model = new Model();
		model.setValue(1);
		
		Demo test = new Demo();
		test.fun(str, i, model);
		
		System.out.println(str+"\t"+i+"\t"+model.getValue());
	}

	public void fun(String str,int i,Model model){
		str="fun_str";
		i = 2;
		model.setValue(2);
		
		System.out.println(str+"\t"+i+"\t"+model.getValue());
	}
}

   java中對於String,int,float等基本類型,都是值傳遞,所以結果如下

fun_str  2  2
str  1  2    

  String和int類型的值copy了一份傳入函數,但是model對象的結果卻是一樣。由此可見,對象傳遞時是引用傳遞,想一想如果20個線程共用這一個對象,值肯定亂成一團。

  就算函數裡重新new一個對象也沒用(下面代碼),因為這麼直接賦值也是引用,把model的地址賦給model2了,淺拷貝(指針引用)。

public void fun(String str,int i,Model model){
    Model model2 = new Model();
    model2 = model;
    str="fun_str";
    i = 2;
    model2.setValue(2);
    System.out.println(str+"\t"+i+"\t"+model2.getValue());
}

 

  要想實現深拷貝(內存中新new一個相同的對象),方法很多,可以把對象的值都取出來傳參,如果太多可以放個map裡,或者java應該有些對象clone的功能吧(下一期研究一下java的clone),如果沒有就自己寫個函數自己手動copy,new一個對象,把原來對象的東西都賦值到新對象中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved