Java - 传参到底是哪种? pass by value or pass by reference
在了解Java傳參數是pass by value或是pass by reference之前,先了解=賦值的用法會對理解傳參很有幫助
-
賦值(=)的用法
-
=的意義是賦值,但是這個賦值用在 基本類型 和 對象類型 上會有非常大的差別
-
如果=用在基本類型上,因為基本類型儲存了實際的數值,所以在為其賦值時,是直接將值複製一份新的過去
-
因此假設a、b都是基本類型,如果執行了a=b,那麼就是將b的內容直接複製一份新的給a,之后如果改變了a的值,也不會影響到b
-
此處的基本類型,泛指 int、long、boolean....和其包裝型態 Integer、Long、Boolean....,只要是這些類型的變量,都適用基本類型的=規則
-
-
但如果=用在對象類型上,因為在使用對象操作時,實際儲存的其實是對象的引用,所以在為其賦值時,實際上只是把 "引用" 從一個地方複製到另一個地方
-
因此假設c、d都是對象類型,如果執行了c=d,那麼c和d都會指向原本只有d指向的那個對象,而原本c的那個對象因為沒人引用了,所以會被垃圾回收清理掉
-
-
-
具體實例
-
t1、t2是基本類型的=效果,t3、t4是對象類型的=效果
-
-
-
pass by value 和 pass by reference
-
和=一樣,只要掌握好基本類型實際儲存的是"值",而對象類型儲存的是"引用",就能了解到底是pass by value還是pass by reference
-
基本類型 pass by value,對象類型 pass by reference
class Tank {int level; } ? public class Main {public static void main(String[] args) throws InterruptedException {Tank t1 = new Tank();Tank t2 = new Tank(); ?t1.level = 1;System.out.println("t1.level: " + t1.level);fooInt(t1.level); //基本類型pass by valueSystem.out.println("t1.level: " + t1.level); ?t2.level = 2;System.out.println("t2.level: " + t2.level);fooTank(t2); //對象類型pass by referenceSystem.out.println("t2.level: " + t2.level);} ?public static void fooTank(Tank tank){tank.level = 1000;} ?public static void fooInt(int level){level = 5;} } t1.level: 1 t1.level: 1 t2.level: 2 t2.level: 1000 -
基本類型的List、Set、Map 也是pass by value,對象類型的List、Set、Map是pass by reference
class Tank {int level; } ? public class Main {public static void main(String[] args) throws InterruptedException {List<Tank> tankList = new ArrayList<>();List<Integer> intList = new ArrayList<>(); ?for (int i = 1; i <= 2; i++) {Tank tank = new Tank();tank.level = i;tankList.add(tank); ?intList.add(i * 100);} ?System.out.println("intList: " + intList.get(0) + ", " + intList.get(1));fooIntList(intList);System.out.println("intList: " + intList.get(0) + ", " + intList.get(1));System.out.println("tankList: " + tankList.get(0).level + ", " + tankList.get(1).level);fooTankList(tankList);System.out.println("tankList: " + tankList.get(0).level + ", " + tankList.get(1).level);} ?public static void fooTankList(List<Tank> tankList) {for (Tank tank : tankList) {tank.level = 500;}} ?public static void fooIntList(List<Integer> intList) {for (Integer i : intList) {i = 2000;}} } intList: 100, 200 intList: 100, 200 tankList: 1, 2 tankList: 500, 500?
-
-
總結
以上是生活随笔為你收集整理的Java - 传参到底是哪种? pass by value or pass by reference的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试篇】牛客网面试总结
- 下一篇: 第九课 Java基础篇——面向对象(综合