成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

值傳遞OR引用傳遞?大部人都答錯了!

開發 前端
在 Java 中,(傳遞參數時)無論是基本數據類型還是對象(或數組),使用的都是值傳遞的方式。只是對于對象(或數組)而言,傳遞的值是對象引用副本,而非對象引用本身。

Java 是值傳遞還是引用傳遞?這是 Java 中比較基礎的一道常見面試題,但對于這道問題的大部分答案都是錯的,大部人會這樣回答這個問題:

在 Java 中,如果傳遞的是基本數據類型,那么就是值傳遞;而如果傳遞的是對象或數組的話,那么就是引用傳遞。

然而,這個答案是錯的!

定義描述

值傳遞和引用傳遞是編程中參數傳遞給方法時的兩種方式,它們的定義如下:

  1. 值傳遞(Pass by Value):在值傳遞中,實際參數的值被復制一份,然后將這份復制的值傳遞給函數或方法的相應參數。因此,函數或方法內對參數所做的任何修改都不會影響到實際參數的值。
  2. 引用傳遞(Pass by Reference):在引用傳遞中,傳遞給方法的是實際參數的引用(或地址)。這意味著方法內對參數所做的任何修改都會直接影響到實際參數。

需要注意的是,有些編程語言,如 C++ 提供了真正的引用傳遞機制,允許你直接傳遞變量的引用,并且可以在函數或方法中改變這個引用的指向。而在 Java 中,即使是對象,也是通過值傳遞的,只不過這個值是對象引用副本(而非對象引用本身)。

正確結論

在 Java 中,(傳遞參數時)無論是基本數據類型還是對象(或數組),使用的都是值傳遞的方式。只是對于對象(或數組)而言,傳遞的值是對象引用副本,而非對象引用本身。

在 Java 中,只有值傳遞沒有引用傳遞。

舉個例子

例如 Integer 是包裝類對象吧?它不是基本數據類型對吧,當我們傳遞 Integer 對象時,在新方法所做的所有修改,并不會影響原對象本身,具體示例代碼如下:

public class PassExample {
    public static void main(String[] args) {
        Integer number = new Integer(10);
        method(number);
        System.out.println("number:" + number); // 輸出:number:10
    }
    public static void method(Integer number) {
        number = 20; // 修改 num 的值,不會影響原始變量的值
    }
}

以上程序的執行結果如下:

圖片圖片

從上述結果可以看出,當傳遞的是 Integer 對象時,其依然是值傳遞,所以在 Java 語言中,并沒有引用傳遞。

因此,無論是基礎數據類型,還是引用數據類型(對象),都為值傳遞,而非引用傳遞。

特殊的例子

有人說:不對啊,磊哥,你看我傳遞數組時,改變傳遞的數組就會影響原數組啊,具體示例如下:

public class PassExample {
    public static void main(String[] args) {
        char[] name = {'磊', '哥'};
        System.out.println("調用方法前:" + new String(name));
        method(name);
        System.out.println("調用方法后:" + new String(name));
    }
    private static void method(char[] n) {
        n[1] = '神';
        System.out.println("方法中修改為:" + new String(n));
    }
}

以上程序的執行結果為:

調用方法前:磊哥

方法中修改為:磊神

調用方法后:磊神

這樣就出問題了,當傳遞了數組之后,明顯是“引用傳遞”,而非值傳遞,這到底是怎么回事?

別著急,當我們把新方法中的代碼做了以下調整之后,運行結果又不一樣了,如下代碼所示:

public class PassExample {
    public static void main(String[] args) {
        char[] name = {'磊', '哥'};
        System.out.println("調用方法前:" + new String(name));
        method(name);
        System.out.println("調用方法后:" + new String(name));
    }
    private static void method(char[] n) {
        n = new char[2]; // 僅僅添加了此行代碼
        n[1] = '神';
        System.out.println("方法中修改為:" + new String(n));
    }
}

以上程序的執行結果為:

調用方法前:磊哥

方法中修改為: 神

調用方法后:磊哥

你會發現,當我們在新方法中僅僅添加了一行“n = new char[2];”代碼時,它又變成了值傳遞,這是怎么回事?

原因分析

如果是引用傳遞,那么我在新方法中無論如何修改,那么都應該是影響原對象才對,而剛才我稍微調整了代碼之后就發現其并非引用傳遞,而是值傳遞,這是因為當傳遞數組時,其傳遞的是“引用副本”,而非真正的引用對象(也就是其本身)。

也就說,當傳遞數組時,其實傳遞的是“引用副本”,如下圖所示:

圖片圖片

然而,在調用了“n = new char[2];”代碼之后,給變量在堆上創建了新對象,此時就不再使用原來的引用副本了,這個時候,再修改新方法中的變量就不影響原變量了,如下圖所示:

圖片圖片

所以,在 Java 中,只有值傳遞,它始終傳遞的都是副本,而非原(引用)對象。

小結

在 Java 中,(傳遞參數時)無論是基本數據類型還是對象(或數組),使用的都是值傳遞的方式。只是對于對象(或數組)而言,傳遞的值是對象引用副本,而非對象引用本身。

責任編輯:武曉燕 來源: 磊哥和Java
相關推薦

2022-07-29 08:05:31

Java值傳遞

2015-09-08 10:16:41

Java參數按值傳遞

2016-09-18 19:07:33

Java值傳遞引用傳遞

2023-11-15 09:14:27

Java值傳遞

2022-05-18 09:49:26

MySQLID數據庫

2020-09-02 08:00:51

Java引用傳遞值傳遞

2022-11-02 15:00:03

Java值傳遞引用傳遞

2009-08-17 14:48:44

Java參數傳遞機制

2021-10-14 06:51:54

SpringSecurityJWT

2012-02-21 14:04:15

Java

2017-12-05 08:53:20

Golang參數傳遞

2025-01-26 16:04:09

2009-09-04 11:00:13

通過C#引用傳遞

2023-11-29 09:47:11

C++對象

2019-10-11 10:05:30

程序員固態硬盤Google

2011-03-25 13:44:28

Java值傳遞

2025-03-11 08:20:00

C++main函數

2019-04-17 13:48:19

JavaScript前端傳遞

2012-12-17 11:00:28

惠普

2025-04-30 07:15:11

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 69av在线视频| 日韩精品在线观看免费 | 欧美一区免费 | 国产精品伦一区二区三级视频 | 日本免费一区二区三区 | 亚洲 欧美 综合 | 日韩av最新网址 | 久久国产精品一区二区三区 | 一级做a爰片久久毛片免费看 | 国产1区| 久久精品小短片 | 日本黄色大片免费看 | 黄色大片视频 | 久久天堂网 | 国产精品特级毛片一区二区三区 | 看av网| 中文字幕免费视频 | 一区二区在线免费观看 | 99精品久久 | 亚洲精品乱 | 久久日韩精品 | 99国产精品99久久久久久 | 日本久久综合 | 久久精品免费一区二区三 | 三级黄色大片网站 | 欧美一级在线观看 | 91精品久久久久久久久中文字幕 | 欧美一区二区三区在线视频 | 精品免费国产一区二区三区四区 | 国产一级视频在线观看 | 精精国产xxxx视频在线播放 | 玖草资源 | 免费在线观看一级毛片 | 亚洲视频区 | 99精品一区二区 | 奇米av | 欧美日韩一区二区三区不卡视频 | 在线观看国产 | 日韩中文字幕 | 欧美日韩在线精品 | 欧美日本在线观看 |