Java 交換兩個變量的數(shù)值實現(xiàn)方法
一、參數(shù)傳遞方法
為解決標(biāo)題問題,首先介紹參數(shù)傳遞方法。目前各類程序設(shè)計語言的參數(shù)傳遞方法主要有三種:
1.按值傳遞
2.按引用傳遞
3.按指針傳遞
其中按值傳遞表示方法(函數(shù))接收的是調(diào)用者提供的變量的拷貝,不改變參數(shù)的值;按引用傳遞表示方法(函數(shù))接收的調(diào)用者提供的變量地址;按指針傳遞表示方法(函數(shù))接收的是調(diào)用者提供的指針的拷貝,不改變指針的值和地址,但可以改變指針?biāo)赶虻牡刂贰?/p>
二、Java參數(shù)傳遞方法
Java提供的參數(shù)傳遞方法,很遺憾只有一種,按值傳遞。也就是說,方法得到的是所有參數(shù)值的一個拷貝,方法不能修改傳遞給它的參數(shù)變量的內(nèi)容。
Java的方法參數(shù)類型可以分為兩類:
1.基本數(shù)據(jù)類型
2.對象引用
有過Java開發(fā)經(jīng)驗的朋友都知道,對于基本數(shù)據(jù)類型,Java方法無法改變變量內(nèi)容。那對自定義類的對象引用是否也不能修改內(nèi)容呢?可以通過一個簡單的例子說明。代碼如下:
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é)果可以編寫個簡單例子,所有的自定義類仍然是上面的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被初始化成實參a的copy,這是對對象的引用。
setNum方法應(yīng)用于這個對象的引用。myClass和a同時引用的那個MyClass對象的num變?yōu)榱?00。
方法結(jié)束后,參數(shù)變量myClass不再使用。而a繼續(xù)引用那個num變?yōu)?00的MyClass對象。如下圖所示。

所以,Java方法能夠?qū)崿F(xiàn)改變對象參數(shù)狀態(tài)的原因是:方法得到的是對象引用的拷貝,對象引用及方法中的其他拷貝同時引用同一個對象。
現(xiàn)在,總結(jié)一下Java的方法參數(shù)使用:
方法不能修改一個基本數(shù)據(jù)類型的參數(shù);
方法可以改變對象參數(shù)的狀態(tài);
方法不能讓對象參數(shù)引用一個新的對象(原因參考調(diào)用change方法時的具體執(zhí)行過程)。
三、交換變量的數(shù)值
既然已經(jīng)知其所以然,那么知其然就不是難事了。直接貼出我的個人代碼:
pubpc static void swap(MyClass a,MyClass b){
Object tmp=a.getNum();
a.setNum(b.getNum());
b.setNum(tmp);
}
執(zhí)行結(jié)果如下:

交換有效。
參考文獻:Java核心技術(shù) 卷Ⅰ。
以上這篇Java 交換兩個變量的數(shù)值實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現(xiàn)
這篇文章主要介紹了SpringBoot通過源碼探究靜態(tài)資源的映射規(guī)則實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
RabbitMQ中的Connection和Channel信道詳解
這篇文章主要介紹了RabbitMQ中的Connection和Channel信道詳解,信道是建立在 Connection 之上的虛擬連接,RabbitMQ 處理的每條 AMQP 指令都是通過信道完成的,需要的朋友可以參考下2023-08-08
SpringBoot中的@RestControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中的@RestControllerAdvice注解詳解,RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個應(yīng)用程序中的異常,需要的朋友可以參考下2024-01-01
Activiti explorer.war示例工程使用過程圖解
這篇文章主要介紹了Activiti explorer.war示例工程使用過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Java內(nèi)存模型(JMM)及happens-before原理
這篇文章主要介紹了java內(nèi)存模型(JMM)及happens-before原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
java編程之基于SpringBoot框架實現(xiàn)掃碼登錄
本文將介紹基于SpringBoot + Vue + Android實現(xiàn)的掃碼登錄demo的總體思路,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
探索Java中private方法添加@Transactional事務(wù)未生效原因
你又遇到過明明給private方法添加了@Transactional但是事務(wù)依然沒有生效的情況嗎,具體原因本篇文章將詳細告訴你,有需要的朋友跟著小編往下看吧2021-11-11

