日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java - 传参到底是哪种? pass by value or pass by reference

發布時間:2023/12/14 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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是對象類型的=效果

      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;t2.level = 2;System.out.println("t1: " + t1.level + ", t2: " + t2.level); ?t1.level = t2.level; //此處只是基本類型的賦值,所以t1、t2仍舊指到兩個不同對象System.out.println("t1: " + t1.level + ", t2: " + t2.level); ?t1.level = 100;System.out.println("t1: " + t1.level + ", t2: " + t2.level); ?System.out.println("----"); ?Tank t3 = new Tank();Tank t4 = new Tank(); ?t3.level = 3;t4.level = 4;System.out.println("t3: " + t3.level + ", t4: " + t4.level);? //此處是對象類型的賦值,所以是t3和t4都指到了同一個對象上//而原本t3那個對象因為沒人引用了,所以會被垃圾回收清理掉t3 = t4;System.out.println("t3: " + t3.level + ", t4: " + t4.level); ?t3.level = 100;System.out.println("t3: " + t3.level + ", t4: " + t4.level); ?} } t1: 1, t2: 2 t1: 2, t2: 2 t1: 100, t2: 2 ---- t3: 3, t4: 4 t3: 4, t4: 4 t3: 100, t4: 100
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。