八大數據類型和String 在進行傳遞的時候 不會改變.函數
八大數據類型大數據
public class parameterValue { //值傳遞 public static void main(String[] args) { int x = 10; method(x); System.out.println(x); } public static void method(int mx) { mx = 20; } /** * 在棧內存中申請mx 這時候 x 和mx 存儲的值 是同樣的,可是x和mx的地址是不同的,mx=20;並不影響x的值. * 八大基本數據類型都是這個吊樣. * */ }
Stringspa
package oneDay; public class RefDemo1 { public static void main(String[] args) { String nameString = "小飛"; String yuanString; yuanString = new String("asd"); System.out.println(yuanString); method(nameString); System.out.println(nameString); } private static void method(String name) { name = "小貝"; // 至關於 name = new String(); name = "小貝"; // 至關於 指向改變 /** * 簡單解釋一下. String nameString 至關於在棧空間中申請了一塊空間,用於存儲引用地址(此時沒有引用地址爲空). * nameString = 小飛; 至關於 nameString = new String("小飛"); 這時候 在堆內存申請了一塊空間用於存儲 實際的值. * 也就是說 在method 這個方法 當中. 形參 String name 至關於 String name; name = nameString; 這時候 name和nameString在棧內存中 * 存儲的引用地址 是同樣的 , 當時當 * name = "小貝";的時候 該代碼 至關於 name = new String("小貝"); 在堆內存中新申請了一塊空間, 將該地址 賦予name 這時候 name和nameString在棧內存中 * 存儲的值(引用地址) 就又不同了. 因此 八大基本數據類型和String 同樣 在 方法中進行傳遞的時候 不會改變自身的值, 可是 類 能夠改變自身的值.. * * */ } }
類code
package oneDay; public class RefDemo { //引用傳遞 public static void main(String[] args) { Duck duckYuan = new Duck(); System.out.println("Duck age = "+duckYuan.age); method(duckYuan); System.out.println("Duck age = "+duckYuan.age); } private static void method(Duck duck) { duck.age = 5; } /** * Duck duckYuan = new Duck(); 在棧內存和堆內存中申請空間,並將 堆內存的地址 放入棧內存中,以待使用. * 形參中的 Duck duck 在棧內存中申請空間,並將上面的duckYuan內存儲的堆內存的地址放入duck中, * 而後 方法內的duck.age = 5; 這時候的duck和duckYuan棧內存地址雖然不一樣,但期內存儲的堆內存的地址 都是指向同一塊堆內存地址的,這樣就改變了原來的值. * * */ } class Duck{ int age = 2; //省略封裝 }
爲何 String也是類可是 不會改變呢? 總結一下:blog
在兩個方法當中內存
name = "小貝";
duck.age = 5;
/** * 八大基本上數據類型屬於值傳遞. * String以及其他的引用數據類型屬於引用傳遞. * 八大基本數據類型和String 不會改變其內容 , 其他的會改變內容. * 八大基本數據類型: 新申請了棧內存空間, 在函數內的 全部操做都是針對形參的, 不管怎樣搞, 都不會改變實參的值. * String: 新申請了佔內存空間, 可是改變String的值的時候, 會將新的堆內存的空間地址放到棧內存當中, 這樣的話本來的棧內存和堆內存都沒有發生變化, 因此String也不會變. * 對於普通的引用數據類型, 在調用函數的時候: 新申請的形參存儲的是本來引用數據類型的堆內存的地址, 在修改數據的時候會改變原來堆內存的內容. 和String的棧內存堆內存都不變相比, 這裏改變了堆內存的內容, 因此值發生變化. * * 能夠作一個實驗, 在普通引用數據類型作形參的時候, 不改變堆內存的內容, 先改變一下 棧內存的地址, 這樣也不會發生變化. */