java通過實例了解值傳遞和引用傳遞
這篇文章主要介紹了java通過實例了解值傳遞和引用傳遞,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
一.java中的值傳遞的問題
指的是在方法調用時,傳遞的參數(shù)是按值的拷貝傳遞。示例如下:
public static void main(String[] args) {
int a=1;
change(a);
System.out.println("交換a后的值:"+a);
}
private static void change(int a) {
a=1111;
System.out.println("交換方法里面的a:"+a);
}
//運行輸出
//交換方法里面的a:1111
//交換a后的值:1
按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關了。
二.java中的引用傳遞的問題
指的是在方法調用時,傳遞的參數(shù)是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。示例如下:
public static void main(String[] args) {
Person p=new Person();
p.setAge(25);
changeAge(p);
System.out.println("改變年齡后的年齡:"+p.getAge());
}
private static void changeAge(Person p) {
p.setAge(35);
System.out.println("改變年齡方法里面的年齡:"+p.getAge());
}
//運行輸出
//改變年齡方法里面的年齡:35
//改變年齡后的年齡:35
class Person{
private int age=10;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用(也就是同一個內存空間),引用類型的傳遞后的修改會影響原來的值。
從上面兩個例子來看,基本數(shù)據(jù)類型的傳遞是值傳遞,傳遞過去的是具體的數(shù)值;而引用數(shù)據(jù)類型的傳遞是引用傳遞,傳遞過去的是內存的地址。其實不然,請看下面的兩個例子。
三.到底是值傳遞還是引用傳遞
請看下面一個例子,String類型也算是引用數(shù)據(jù)類型,把上面第一個值傳遞的里面的整形換成字符串類型,例子代碼如下:
public static void main(String[] args) {
String str="哈哈我是字符串";
change(str);
System.out.println("交換字符串后的值:"+str);
}
private static void change(String str) {
str="我在里面被交換了";
System.out.println("交換方法里面的字符串:"+str);
}
//交換方法里面的字符串:我在里面被交換了
//交換字符串后的值:哈哈我是字符串
交換以后,引用類型的傳遞str并沒有改變,嘗試使用String s=new String("xxx");嘗試還是沒有改變.如果說String類比較特殊,請看下面的例子。
public static void main(String[] args) {
Person p=new Person();
p.setAge(25);
changeAge(p);
System.out.println("改變年齡后的年齡:"+p.getAge());
}
private static void changeAge(Person p) {
p=new Person();
p.setAge(35);
System.out.println("改變年齡方法里面的年齡:"+p.getAge());
}
//運行輸出
//改變年齡方法里面的年齡:35
//改變年齡后的年齡:25
我們在方法里面重新改變person對象的指向,這時如果是引用傳遞,必然會導致p對象里面的age發(fā)生改變,但是實際上并未改變。這里確實是按照引用傳遞的,但是傳遞的還是引用的一個副本,并不是原始的引用本身。在 Java 應用程序中,當對象引用是傳遞給方法的一個參數(shù)時,您傳遞的是該引用的一個副本(可以認為特殊的值傳遞),而不是引用本身。
四.總結
在java里面,一般不可變的對象 例于String 和8大基本數(shù)據(jù)類型的這些,都是值的傳遞,其他引用數(shù)據(jù)類型的傳遞是引用副本的傳遞。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Springboot事件和bean生命周期執(zhí)行機制實例詳解
這篇文章主要介紹了Springboot事件和bean的生命周期執(zhí)行機制,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Spring?Boot?整合?FreeMarker?實例分享
這篇文章主要分享了Spring?Boot整合FreeMarker?實例FreeMarker是一款模板引擎,即一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本,更多相關介紹需要的小伙伴可以參考下面文章內容2022-05-05
Springboot開發(fā)OAuth2認證授權與資源服務器操作
這篇文章主要介紹了Springboot開發(fā)OAuth2認證授權與資源服務器操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用
本文主要介紹了SpringBoot?整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-04-04
Java對世界不同時區(qū)timezone之間時間轉換的處理方法
這篇文章主要介紹了Java對世界不同時區(qū)timezone之間時間轉換的處理方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07

