1. 程式人生 > >java傳參方式

java傳參方式

java傳參分兩種型別,java都是值傳遞


1.基本型別使用值傳遞,形參是對實參的一個拷貝,在方法裡對形參修改不影響實參的值


2.引用型別是引用值傳遞,對於類的例項它傳遞的是類的引用,形參是對實參的引用值得拷貝,形參可實參指向的是同一個物件地址
例子

public class testchuancan {

	public static void main(String[] args) {
		// 引用值傳遞
		MyClass myClass = new MyClass();
		StringBuffer buffer_real = new StringBuffer("hello");
		myClass.changeValue(buffer_real);
		System.out.println(buffer_real.toString());
		// 基本型別值傳遞
		int k = 1;
		myClass.changeBaseVar(k);
		System.out.println("changeBaseVar外部非static" + k);
	}
}

class MyClass {
	void changeValue(StringBuffer buffer_formal) {// 對引用變數,傳參是引用值傳遞
		buffer_formal.append("world");// 形參buffer_formal和實參buffer_real指向的同一塊記憶體
		System.out.println("changeValue內部:" + buffer_formal.toString());
		buffer_formal = new StringBuffer("1111");// 形參buffer指向了新的引用,不影響實參的值
		System.out.println("changeValue內部:" + buffer_formal.toString());
	}

	void changeBaseVar(int i) {// 基本型別直接拷貝值傳遞
		i++;
		System.out.println("changeBaseVar內部" + i);
	}
}

另外一個例子說明物件傳遞也是值傳遞
public class testobjchuanzhi {
	public static void main(String args[]) {
		Student s1 = new Student("ACE");
		Student s2 = new Student("SABO");
		swap(s1, s2);
		s1.pn("swap方法外,s1_fomal");
		s2.pn("swap方法外,s2_fomal");
	}
	public static void swap(Student s1_fomal, Student s2_fomal) {
		// 使用形參操作真實物件
		s1_fomal.modiName("lufei");
		s1_fomal.pn("交換之前swap方法內,修改名字的s1_fomal");
		// s1_fomal s2_fomal 傳遞的是 s1 s2的引用值拷貝
		// s1和s1_fomal指向的是同一個物件。s2和s2_fomal指向的是同一個物件。交換fomal不影響real,但s1_fomal可以操作物件
		Student temp = s1_fomal;
		s1_fomal = s2_fomal;
		s2_fomal = temp;
		// s1_fomal s2 _fomal形參使用之後就被丟棄
		s1_fomal.pn("交換之後swap方法內,s1_fomal");
		s2_fomal.pn("交換之後swap方法內,s2_fomal");
	}
}
class Student {
	String name;
	int age;
	public Student(String var) {
		this.name = var;
	}
	public void pn(String temp) {
		System.out.println(temp + ":" + name);
	}
	public void modiName(String var) {
		name = var;
	}
}

結果:
交換之前swap方法內,修改名字的s1_fomal:lufei
交換之後swap方法內,s1_fomal:SABO
交換之後swap方法內,s2_fomal:lufei
swap方法外,s1_fomal:lufei
swap方法外,s2_fomal:SABO