java究竟是值傳遞仍是引用傳遞?

public class TestMain {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add(i);
		}
		add(list);
		for (Integer j : list) {
			System.err.print(j+",");;
		}
		System.err.println("");
		System.err.println("*********************");
		String a="A";
		append(a);
		System.err.println(a);
		int num = 5;
		addNum(num);
		System.err.println(num);
	}
	
	static void add(List<Integer> list){
		list.add(100);
	}
	
	static void append(String str){
		str+="is a";
	}
	static void addNum(int a){
		a=a+10;
	}
}

打印出來的結果是:
0,1,2,3,4,5,6,7,8,9,100,
*********************
A
5java

一:搞清楚 基本類型 和 引用類型的不一樣之處
int num = 10;
String str = "hello";


如圖所示,num是基本類型,值就直接保存在變量中。而str是引用類型,變量中保存的只是實際對象的地址。通常稱這種變量爲"引用",引用指向實際對象,實際對象中保存着內容。

二:搞清楚賦值運算符(=)的做用windows

num = 20;
str = "java";

對於基本類型 num ,賦值運算符會直接改變變量的值,原來的值被覆蓋掉。
對於引用類型 str,賦值運算符會改變引用中所保存的地址,原來的地址被覆蓋掉。可是原來的對象不會被改變(重要)。
如上圖所示,"hello" 字符串對象沒有被改變。(沒有被任何引用所指向的對象是垃圾,會被垃圾回收器回收)

三:調用方法時發生了什麼?參數傳遞基本上就是賦值操做app

第一個例子:基本類型
void foo(int value) {
    value = 100;
}
foo(num); // num 沒有被改變

第二個例子:沒有提供改變自身方法的引用類型
void foo(String text) {
    text = "windows";
}
foo(str); // str 也沒有被改變

第三個例子:提供了改變自身方法的引用類型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder.append("4");
}
foo(sb); // sb 被改變了,變成了"iphone4"。

第四個例子:提供了改變自身方法的引用類型,可是不使用,而是使用賦值運算符。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
}
foo(sb); // sb 沒有被改變,仍是 "iphone"。


重點理解爲何,第三個例子和第四個例子結果不一樣?

下面是第三個例子的圖解:
builder.append("4")以後
下面是第四個例子的圖解:

builder = new StringBuilder("ipad"); 以後
iphone

相關文章
相關標籤/搜索