Java 交換兩個(gè)變量的數(shù)值實(shí)現(xiàn)方法
一、參數(shù)傳遞方法
為解決標(biāo)題問題,首先介紹參數(shù)傳遞方法。目前各類程序設(shè)計(jì)語言的參數(shù)傳遞方法主要有三種:
1.按值傳遞
2.按引用傳遞
3.按指針傳遞
其中按值傳遞表示方法(函數(shù))接收的是調(diào)用者提供的變量的拷貝,不改變參數(shù)的值;按引用傳遞表示方法(函數(shù))接收的調(diào)用者提供的變量地址;按指針傳遞表示方法(函數(shù))接收的是調(diào)用者提供的指針的拷貝,不改變指針的值和地址,但可以改變指針?biāo)赶虻牡刂贰?/p>
二、Java參數(shù)傳遞方法
Java提供的參數(shù)傳遞方法,很遺憾只有一種,按值傳遞。也就是說,方法得到的是所有參數(shù)值的一個(gè)拷貝,方法不能修改傳遞給它的參數(shù)變量的內(nèi)容。
Java的方法參數(shù)類型可以分為兩類:
1.基本數(shù)據(jù)類型
2.對象引用
有過Java開發(fā)經(jīng)驗(yàn)的朋友都知道,對于基本數(shù)據(jù)類型,Java方法無法改變變量內(nèi)容。那對自定義類的對象引用是否也不能修改內(nèi)容呢?可以通過一個(gè)簡單的例子說明。代碼如下:
pubpc class MyClass{ private Object num; pubpc MyClass(Object num){ this.num=num; } pubpc Object getNum() { return num; } pubpc void setNum(Object num) { this.num = num; } }
pubpc class Main { pubpc static void change(MyClass myClass){ myClass.setNum(100); } pubpc static void main(String[] args){ MyClass a=new MyClass(10); System.out.println("調(diào)用change方法前的值為:"+a.getNum()); change(a); System.out.println("調(diào)用change方法后的值為:"+a.getNum()); } }
上面代碼執(zhí)行輸出結(jié)果如下:
從結(jié)果中可以看出,change方法能夠修改對象的狀態(tài)。也就是說Java方法可以改變對象的參數(shù)狀態(tài)。那這是否意味著Java方法對于自定義的數(shù)據(jù)類型(自定義類)的參數(shù)采用的是引用傳遞?為了確認(rèn)結(jié)果可以編寫個(gè)簡單例子,所有的自定義類仍然是上面的MyClass。代碼如下:
pubpc static void swap(MyClass a,MyClass b){ MyClass tmp=a; a=b; b=tmp; } pubpc static void main(String[] args){ MyClass a=new MyClass(10); MyClass b=new MyClass(100); System.out.println("交換之前a的值為:"+a.getNum()); System.out.println("交換之前b的值為:"+b.getNum()); swap(a,b); System.out.println("交換之后a的值為:"+a.getNum()); System.out.println("交換之后b的值為:"+b.getNum()); } }
執(zhí)行結(jié)果如下:
通過上面結(jié)果可以發(fā)現(xiàn),Java方法對自定義類的參數(shù)傳遞使用的仍然是值傳遞,不是引用傳遞。那為什么Java方法能夠修改對象狀態(tài)呢?
可以考慮調(diào)用change方法的具體執(zhí)行過程,從中尋找答案。
調(diào)用change方法事,具體的執(zhí)行過程是:
myClass被初始化成實(shí)參a的copy,這是對對象的引用。
setNum方法應(yīng)用于這個(gè)對象的引用。myClass和a同時(shí)引用的那個(gè)MyClass對象的num變?yōu)榱?00。
方法結(jié)束后,參數(shù)變量myClass不再使用。而a繼續(xù)引用那個(gè)num變?yōu)?00的MyClass對象。如下圖所示。
所以,Java方法能夠?qū)崿F(xiàn)改變對象參數(shù)狀態(tài)的原因是:方法得到的是對象引用的拷貝,對象引用及方法中的其他拷貝同時(shí)引用同一個(gè)對象。
現(xiàn)在,總結(jié)一下Java的方法參數(shù)使用:
方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù);
方法可以改變對象參數(shù)的狀態(tài);
方法不能讓對象參數(shù)引用一個(gè)新的對象(原因參考調(diào)用change方法時(shí)的具體執(zhí)行過程)。
三、交換變量的數(shù)值
既然已經(jīng)知其所以然,那么知其然就不是難事了。直接貼出我的個(gè)人代碼:
pubpc static void swap(MyClass a,MyClass b){ Object tmp=a.getNum(); a.setNum(b.getNum()); b.setNum(tmp); }
執(zhí)行結(jié)果如下:
交換有效。
參考文獻(xiàn):Java核心技術(shù) 卷Ⅰ。
以上這篇Java 交換兩個(gè)變量的數(shù)值實(shí)現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot下實(shí)現(xiàn)RedisTemplate?List?清空
我們經(jīng)常會使用Redis的List數(shù)據(jù)結(jié)構(gòu)來存儲一系列的元素,當(dāng)我們需要清空一個(gè)List時(shí),可以使用RedisTemplate來實(shí)現(xiàn),本文就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2024-01-01通過java記錄數(shù)據(jù)持續(xù)變化時(shí)間代碼解析
這篇文章主要介紹了通過java記錄數(shù)據(jù)持續(xù)變化時(shí)間代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼,需要的朋友可以參考下2017-06-06Spring Boot處理全局統(tǒng)一異常的兩種方法與區(qū)別
這篇文章主要給大家介紹了關(guān)于Spring Boot處理全局統(tǒng)一異常的兩種方法與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題
這篇文章主要介紹了解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08SpringBoot 下集成緩存工具類 CacheManager
這篇文章主要介紹了Springboot下集成緩存工具類CacheManager,想進(jìn)一步了解相關(guān)知識的同學(xué),可以詳細(xì)閱讀本文2023-03-03