一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java基本數(shù)據(jù)類型傳遞與引用傳遞區(qū)別詳解

 關(guān)平藏書 2018-04-27

java的值傳遞和引用傳遞在面試中一般都會都被涉及到,今天我們就來聊聊這個問題,首先我們必須認(rèn)識到這個問題一般是相對函數(shù)而言的,也就是java中的方法參數(shù),那么我們先來回顧一下在程序設(shè)計語言中有關(guān)參數(shù)傳遞給方法(或函數(shù))的兩個專業(yè)術(shù)語:

  • 按值調(diào)用(call by value)

  • 按引用調(diào)用(call by reference)

所謂的按值調(diào)用表示方法接收的是調(diào)用著提供的值,而按引用調(diào)用則表示方法接收的是調(diào)用者提供的變量地址(如果是C語言的話來說就是指針啦,當(dāng)然java并沒有指針的概念)。這里我們需要注意的是一個方法可以修改傳遞引用所對應(yīng)的變量值,而不能修改傳遞值調(diào)用所對應(yīng)的變量值,這句話相當(dāng)重要,這是按值調(diào)用與引用調(diào)用的根本區(qū)別,當(dāng)然如果還不理解,沒關(guān)系,下面就要圖文并茂的徹底分析啦。

前面我們說過java中并不存在引用調(diào)用,這點是沒錯的,因為java程序設(shè)計語言確實是采用了按值調(diào)用,即call by value。也就是說方法得到的是所有參數(shù)值的一個拷貝,方法并不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。下面我們來看一個例子:

[java] view plain copy
  1. package com.zejian.test;  
  2. /** 
  3.  * java中的按值調(diào)用 
  4.  * @author zejian 
  5.  */  
  6. public class CallByValue {  
  7.       
  8.     private static int x=10;  
  9.       
  10.     public static void updateValue(int value){  
  11.         value = 3 * value;  
  12.     }  
  13.       
  14.     public static void main(String[] args) {  
  15.         System.out.println("調(diào)用前x的值:"+x);  
  16.         updateValue(x);  
  17.         System.out.println("調(diào)用后x的值:"+x);  
  18.     }  
  19.       
  20. }  

運行程序,結(jié)果如下:

調(diào)用前x的值:10

調(diào)用后x的值:10

可以看到x的值并沒有變化,接下來我們一起來看一下具體的執(zhí)行過程:


分析:

1)value被初始化為x值的一個拷貝(也就是10)

2)value被乘以3后等于30,但注意此時x的值仍為10!

3)這個方法結(jié)束后,參數(shù)變量value不再使用,被回收。

結(jié)論:當(dāng)傳遞方法參數(shù)類型為基本數(shù)據(jù)類型(數(shù)字以及布爾值)時,一個方法是不可能修改一個基本數(shù)據(jù)類型的參數(shù)。

當(dāng)然java中除了基本數(shù)據(jù)類型還有引用數(shù)據(jù)類型,也就是對象引用,那么對于這種數(shù)據(jù)類型又是怎么樣的情況呢?我們還是一樣先來看一個例子:

聲明一個User對象類型:

[java] view plain copy
  1. package com.zejian.test;  
  2. public class User {  
  3.     private String name;  
  4.     private int age;  
  5.     public User(String name, int age) {  
  6.         this.name=name;  
  7.         this.age=age;  
  8.     }  
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.     public void setName(String name) {  
  13.         this.name = name;  
  14.     }  
  15.     public int getAge() {  
  16.         return age;  
  17.     }  
  18.     public void setAge(int age) {  
  19.         this.age = age;  
  20.     }  
  21. }  

執(zhí)行類如下:

[java] view plain copy
  1. package com.zejian.test;  
  2. /** 
  3.  * java中的按值調(diào)用 
  4.  * @author zejian 
  5.  */  
  6. public class CallByValue {  
  7.     private static User user=null;  
  8.     public static void updateUser(User student){  
  9.         student.setName("Lishen");  
  10.         student.setAge(18);  
  11.     }  
  12.       
  13.       
  14.     public static void main(String[] args) {  
  15.         user = new User("zhangsan",26);  
  16.         System.out.println("調(diào)用前user的值:"+user.toString());  
  17.         updateUser(user);  
  18.         System.out.println("調(diào)用后user的值:"+user.toString());  
  19.     }  
  20. }  

運行結(jié)果如下:

調(diào)用前user的值:User [name=zhangsan, age=26]

調(diào)用后user的值:User [name=Lishen, age=18]

很顯然,User的值被改變了,也就是說方法參數(shù)類型如果是引用類型的話,引用類型對應(yīng)的值將會被修改,下面我們來分析一下這個過程:


過程分析:

1)student變量被初始化為user值的拷貝,這里是一個對象的引用。

2)調(diào)用student變量的set方法作用在這個引用對象上,user和student同時引用的User對象內(nèi)部值被修改。

3)方法結(jié)束后,student變量不再使用,被釋放,而user還是沒有變,依然指向User對象。

結(jié)論:當(dāng)傳遞方法參數(shù)類型為引用數(shù)據(jù)類型時,一個方法將修改一個引用數(shù)據(jù)類型的參數(shù)所指向?qū)ο蟮闹怠?/span>

雖然到這里兩個數(shù)據(jù)類型的傳遞都分析完了,也明白的基本數(shù)據(jù)類型的傳遞和引用數(shù)據(jù)類型的傳遞區(qū)別,前者將不會修改原數(shù)據(jù)的值,而后者將會修改引用所指向?qū)ο蟮闹怠?赏ㄟ^上面的實例我們可能就會覺得java同時擁有按值調(diào)用和按引用調(diào)用啊,可惜的是這樣的理解是有誤導(dǎo)性的,雖然上面引用傳遞表面上體現(xiàn)了按引用調(diào)用現(xiàn)象,但是java中確實只有按值調(diào)用而沒有按引用調(diào)用。到這里估計不少人都蒙逼了,下面我們通過一個反例來說明(回憶一下開頭我們所說明的按值調(diào)用與按引用調(diào)用的根本區(qū)別)。

[java] view plain copy
  1. package com.zejian.test;  
  2. /** 
  3.  * java中的按值調(diào)用 
  4.  * @author zejian 
  5.  */  
  6. public class CallByValue {  
  7.     private static User user=null;  
  8.     private static User stu=null;  
  9.       
  10.     /** 
  11.      * 交換兩個對象 
  12.      * @param x 
  13.      * @param y 
  14.      */  
  15.     public static void swap(User x,User y){  
  16.         User temp =x;  
  17.         x=y;  
  18.         y=temp;  
  19.     }  
  20.       
  21.       
  22.     public static void main(String[] args) {  
  23.         user = new User("user",26);  
  24.         stu = new User("stu",18);  
  25.         System.out.println("調(diào)用前user的值:"+user.toString());  
  26.         System.out.println("調(diào)用前stu的值:"+stu.toString());  
  27.         swap(user,stu);  
  28.         System.out.println("調(diào)用后user的值:"+user.toString());  
  29.         System.out.println("調(diào)用后stu的值:"+stu.toString());  
  30.     }  
  31. }  

我們通過一個swap函數(shù)來交換兩個變量user和stu的值,在前面我們說過,如果是按引用調(diào)用那么一個方法可以修改傳遞引用所對應(yīng)的變量值,也就是說如果java是按引用調(diào)用的話,那么swap方法將能夠?qū)崿F(xiàn)數(shù)據(jù)的交換,而實際運行結(jié)果是:

調(diào)用前user的值:User [name=user, age=26]

調(diào)用前stu的值:User [name=stu, age=18]

調(diào)用后user的值:User [name=user, age=26]

調(diào)用后stu的值:User [name=stu, age=18]

我們發(fā)現(xiàn)user和stu的值并沒有發(fā)生變化,也就是方法并沒有改變存儲在變量user和stu中的對象引用。swap方法的參數(shù)x和y被初始化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝的值而已,最終,所做的事都是白費力氣罷了。在方法結(jié)束后x,y將被丟棄,而原來的變量user和stu仍然引用這個方法調(diào)用之前所引用的對象。


這個過程也充分說明了java程序設(shè)計語言對對象采用的不是引用調(diào)用,實際上是對象引用進(jìn)行的是值傳遞,當(dāng)然在這里我們可以簡單理解為這就是按值調(diào)用和引用調(diào)用的區(qū)別,而且必須明白即使java函數(shù)在傳遞引用數(shù)據(jù)類型時,也只是拷貝了引用的值罷了,之所以能修改引用數(shù)據(jù)是因為它們同時指向了一個對象,但這仍然是按值調(diào)用而不是引用調(diào)用。

總結(jié):

  • 一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)(數(shù)值型和布爾型)。

  • 一個方法可以修改一個引用所指向的對象狀態(tài),但這仍然是按值調(diào)用而非引用調(diào)用。

  • 上面兩種傳遞都進(jìn)行了值拷貝的過程。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩有码一二三区| 国产高清在线不卡一区| 亚洲欧美日韩国产成人| 日韩精品视频一二三区| 亚洲综合色在线视频香蕉视频| 亚洲欧洲一区二区中文字幕| 中文字幕乱子论一区二区三区| 久久99夜色精品噜噜亚洲av| 免费在线成人激情视频| 午夜午夜精品一区二区| av在线免费观看一区二区三区| 亚洲欧美日韩在线中文字幕| 亚洲中文字幕在线综合视频| 日韩欧美国产精品中文字幕| 亚洲精品av少妇在线观看| 国产av一二三区在线观看| 久久亚洲午夜精品毛片| 男人操女人下面国产剧情| 日韩一区二区三区四区乱码视频| 永久福利盒子日韩日韩| 亚洲欧美日韩综合在线成成| 99在线视频精品免费播放| 国产精品欧美激情在线播放| 日韩中文无线码在线视频 | 日韩精品在线观看完整版| 精品国产品国语在线不卡| 日韩不卡一区二区视频| 在线欧美精品二区三区| 日韩熟妇人妻一区二区三区| 美女被后入福利在线观看| 午夜精品福利视频观看| 日韩精品免费一区二区三区| 日韩国产精品激情一区| 91久久精品中文内射| 国产精品日韩欧美一区二区| 日韩免费av一区二区三区| 沐浴偷拍一区二区视频| 丝袜破了有美女肉体免费观看| 国产日产欧美精品大秀| 亚洲一区二区三区精选| 国产又粗又爽又猛又黄的|