package tmp;apublic class Main {public static void show(String s) {//s = "def";s = s+"def"; // S只是 show方法的一個局部變數,/* * 當我們 String str = "abc"; show(str) 調用這個函數的時候,以我們引用傳值的方式來判斷,為什麼str 的值不被改變? * 下面我們分析一下,方法還是以前的方法,調用 show()方法時,將str 所指對象的引用複製一份傳遞給show()方法中的S參數 * 接下來我們操作的就是S所指的對象,當我們在執行 s+"def" 時,其實 String類型和其他類型的區別就在於它的對象是不可變的 * 當我們再執行 s+"def"的時候,它其實又重新建立了一個對象,將其引用又重新賦值給了s,然函數執行完後,Str指向的還是以前的 * 對象,和以前並沒有什麼區別,只不過內在中又多了一個s+"def" 對象,(由於函數範圍,該對象可以很快就被回收) * 所以這是就為什麼String類型做參數效果和其他類型不一樣的原因,主要就是String 是一個不可變的對象,再加上函數範圍, * 傳遞過來的引用的值後,改變的是另一個對象,與原來的對象沒有關係,所以原來的對象沒有變 * * */}public static void show(Person p) {p.setAge(100);}public static void show(Integer a) {a++;}public static void show(StringBuffer s){s.append("gggg");}public static void main(String args[]) {String str = new String("abc");show (str);System.out.println(str);// 沒有變// +-------------------------------------StringBuffer bf = new StringBuffer("abc");show(bf);System.out.println(bf);// 變了//+-------------------------------------Integer a = 1;show(a);System.out.println(a); // 沒有變//+-------------------------------------Person p = new Person("boy",0);show(p);System.out.println(p);// 變了//+-------------------------------------}}