最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文秒懂java到底是值傳遞還是引用傳遞

 更新時(shí)間:2020年06月17日 10:57:17   作者:qq_41816971  
這篇文章主要介紹了java到底是值傳遞還是引用傳遞的相關(guān)知識,本文通過幾個(gè)例子給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

首先回顧一下在程序設(shè)計(jì)語言中有關(guān)將參數(shù)傳遞給方法(或函數(shù))的一些專業(yè)術(shù)語。按值調(diào)用(call by value)表示方法接收的是調(diào)用者提供的值,而按引用調(diào)用(call by reference)表示方法接收的是調(diào)用者提供的變量地址。一個(gè)方法可以修改傳遞引用所對應(yīng)的變量值,而不能修改傳遞值調(diào)用所對應(yīng)的變量值。 它用來描述各種程序設(shè)計(jì)語言(不只是 Java)中方法參數(shù)傳遞方式。

Java 程序設(shè)計(jì)語言總是采用按值調(diào)用。也就是說,方法得到的是所有參數(shù)值的一個(gè)拷貝,也就是說,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。

下面通過 3 個(gè)例子來給大家說明

example 1

public static void main(String[] args) {
 int num1 = 10;
 int num2 = 20;
 
 swap(num1, num2);
 
 System.out.println("num1 = " + num1);
 System.out.println("num2 = " + num2);
}
 
public static void swap(int a, int b) {
 int temp = a;
 a = b;
 b = temp;
 
 System.out.println("a = " + a);
 System.out.println("b = " + b);
}

 

結(jié)果:

a = 20
b = 10
num1 = 10
num2 = 20

解析:

example 1

在 swap 方法中,a、b 的值進(jìn)行交換,并不會影響到 num1、num2。因?yàn)?,a、b 中的值,只是從 num1、num2 的復(fù)制過來的。也就是說,a、b 相當(dāng)于 num1、num2 的副本,副本的內(nèi)容無論怎么修改,都不會影響到原件本身。

通過上面例子,我們已經(jīng)知道了一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù),而對象引用作為參數(shù)就不一樣,請看 example2.

example 2

public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 };
		System.out.println(arr[0]);
		change(arr);
		System.out.println(arr[0]);
	}
 
	public static void change(int[] array) {
		// 將數(shù)組的第一個(gè)元素變?yōu)?
		array[0] = 0;
	}

 

結(jié)果:

1
0

解析:

example 2

array 被初始化 arr 的拷貝也就是一個(gè)對象的引用,也就是說 array 和 arr 指向的是同一個(gè)數(shù)組對象。 因此,外部對引用對象的改變會反映到所對應(yīng)的對象上。

通過 example2 我們已經(jīng)看到,實(shí)現(xiàn)一個(gè)改變對象參數(shù)狀態(tài)的方法并不是一件難事。理由很簡單,方法得到的是對象引用的拷貝,對象引用及其他的拷貝同時(shí)引用同一個(gè)對象。

很多程序設(shè)計(jì)語言(特別是,C++和 Pascal)提供了兩種參數(shù)傳遞的方式:值調(diào)用和引用調(diào)用。有些程序員(甚至本書的作者)認(rèn)為 Java 程序設(shè)計(jì)語言對對象采用的是引用調(diào)用,實(shí)際上,這種理解是不對的。由于這種誤解具有一定的普遍性,所以下面給出一個(gè)反例來詳細(xì)地闡述一下這個(gè)問題。

example 3

public class Test {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student s1 = new Student("小張");
		Student s2 = new Student("小李");
		Test.swap(s1, s2);
		System.out.println("s1:" + s1.getName());
		System.out.println("s2:" + s2.getName());
	}
 
	public static void swap(Student x, Student y) {
		Student temp = x;
		x = y;
		y = temp;
		System.out.println("x:" + x.getName());
		System.out.println("y:" + y.getName());
	}
}

結(jié)果:

x:小李
y:小張
s1:小張
s2:小李

解析:

交換之前:

交換之后:

通過上面兩張圖可以很清晰的看出: 方法并沒有改變存儲在變量 s1 和 s2 中的對象引用。swap 方法的參數(shù) x 和 y 被初始化為兩個(gè)對象引用的拷貝,這個(gè)方法交換的是這兩個(gè)拷貝

總結(jié)

Java 程序設(shè)計(jì)語言對對象采用的不是引用調(diào)用,實(shí)際上,對象引用是按 值傳遞的。

下面再總結(jié)一下 Java 中方法參數(shù)的使用情況:

  • 一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)(即數(shù)值型或布爾型)。
  • 一個(gè)方法可以改變一個(gè)對象參數(shù)的狀態(tài)。
  • 一個(gè)方法不能讓對象參數(shù)引用一個(gè)新的對象。

參考:

《Java 核心技術(shù)卷 Ⅰ》基礎(chǔ)知識第十版第四章 4.5 小節(jié)

到此這篇關(guān)于一文秒懂java到底是值傳遞還是引用傳遞的文章就介紹到這了,更多相關(guān)java 值傳遞還是引用傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法

    IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法

    本文主要介紹了IDEA快速部署Spring?Boot?項(xiàng)目到Docker的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java自定義注解用法實(shí)例小結(jié)

    Java自定義注解用法實(shí)例小結(jié)

    這篇文章主要介紹了Java自定義注解用法,結(jié)合實(shí)例形式總結(jié)分析了java常見的自定義注解類型、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能

    SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能

    這篇文章主要介紹了SocketIo+SpringMvc實(shí)現(xiàn)文件的上傳下載功能,socketIo不僅可以用來做聊天工具,也可以實(shí)現(xiàn)局域網(wǎng)。文中給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2018-08-08
  • 詳解mybatis @SelectProvider 注解

    詳解mybatis @SelectProvider 注解

    這篇文章主要介紹了mybatis @SelectProvider 注解的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-12-12
  • Java編程子類能否重寫父類的靜態(tài)方法探索

    Java編程子類能否重寫父類的靜態(tài)方法探索

    關(guān)于子類能否重寫父類的靜態(tài)方法,對像我這種初級的編程愛好者來說仍是值得討論的一件事,下面我們通過具體實(shí)例,對此問題進(jìn)行簡單的探索。
    2017-10-10
  • MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    在MyBatis-Plus中,可以通過自定義攔截器來實(shí)現(xiàn)對SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java實(shí)現(xiàn)斷點(diǎn)下載功能的示例代碼

    Java實(shí)現(xiàn)斷點(diǎn)下載功能的示例代碼

    當(dāng)下載一個(gè)很大的文件時(shí),如果下載到一半暫停,如果繼續(xù)下載呢?斷點(diǎn)下載就是解決這個(gè)問題的。本文將用Java語言實(shí)現(xiàn)斷點(diǎn)下載,需要的可以參考一下
    2022-05-05
  • Java編程中的一些常見問題匯總

    Java編程中的一些常見問題匯總

    這篇文章主要介紹了Java編程中的一些常見問題匯總,本文總結(jié)的都是一些Java代碼中比較典型的錯(cuò)誤,需要的朋友可以參考下
    2014-09-09
  • Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)

    Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)

    這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java AES256加密解密示例代碼

    Java AES256加密解密示例代碼

    這篇文章主要介紹了Java AES256加密解密示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

璧山县| 双桥区| 普格县| 永年县| 沂水县| 甘德县| 砚山县| 休宁县| 昂仁县| 富宁县| 五家渠市| 阿合奇县| 甘孜县| 舒城县| 永靖县| 新巴尔虎右旗| 泰安市| 舞钢市| 太康县| 建阳市| 连山| 六枝特区| 镇坪县| 金平| 靖边县| 甘泉县| 石嘴山市| 潞城市| 多伦县| 门源| 黑龙江省| 福建省| 南投县| 泰州市| 临夏市| 琼中| 万州区| 鄂托克旗| 峨眉山市| 五原县| 长兴县|