欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java按值傳遞還是按引用傳遞

 更新時間:2018年01月16日 10:05:32   作者:機智的古辛瑞  
這篇文章主要介紹了解析Java按值傳遞還是按引用傳遞,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1:按值傳遞是什么

指的是在方法調用時,傳遞的參數(shù)是按值的拷貝傳遞。示例如下:

public class TempTest { 
private void test1(int a){ 
//做點事情 
} 
public static void main(String[] args) { 
TempTest t = new TempTest(); 
int a = 3; 
t.test1(a);//這里傳遞的參數(shù)a就是按值傳遞 
} 
} 

按值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞后就互不相關了。

示例如下:

public class TempTest { 
private void test1(int a){ 
a = 5; 
System.out.println("test1方法中的a="+a); 
} 
public static void main(String[] args) { 
TempTest t = new TempTest(); 
int a = 3; 
t.test1(a);//傳遞后,test1方法對變量值的改變不影響這里的a 
System.out.println(”main方法中的a=”+a); 
} 
} 

運行結果是:

test1方法中的a=5 
main方法中的a=3 

2:按引用傳遞是什么

指的是在方法調用時,傳遞的參數(shù)是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。

示例如下:

public class TempTest { 
private void test1(A a){ 
} 
public static void main(String[] args) { 
TempTest t = new TempTest(); 
A a = new A(); 
t.test1(a); //這里傳遞的參數(shù)a就是按引用傳遞 
} 
} 
class A{ 
public int age = 0; 
} 

3:按引用傳遞的重要特點

傳遞的是值的引用,也就是說傳遞前和傳遞后都指向同一個引用(也就是同一個內存空間)。

示例如下:

public class TempTest { 
private void test1(A a){ 
a.age = 20; 
System.out.println("test1方法中的age="+a.age); 
} 
public static void main(String[] args) { 
TempTest t = new TempTest(); 
A a = new A(); 
a.age = 10; 
t.test1(a); 
System.out.println(”main方法中的age=”+a.age); 
} 
} 
class A{ 
public int age = 0; 
} 

運行結果如下:

test1方法中的age=20 
main方法中的age=20 

4:理解按引用傳遞的過程——內存分配示意圖

要想正確理解按引用傳遞的過程,就必須學會理解內存分配的過程,內存分配示意圖可以輔助我們去理解這個過程。

用上面的例子來進行分析:

(1):運行開始,運行第8行,創(chuàng)建了一個A的實例,內存分配示意如下:


(2):運行第9行,是修改A實例里面的age的值,運行后內存分配示意如下:


(3):運行第10行,是把main方法中的變量a所引用的內存空間地址,按引用傳遞給test1方法中的a變量。請注意:這兩個a變量是完全不同的,不要被名稱相同所蒙蔽。

內存分配示意如下:


由于是按引用傳遞,也就是傳遞的是內存空間的地址,所以傳遞完成后形成的新的內存示意圖如下:


也就是說:是兩個變量都指向同一個空間。

(4):運行第3行,為test1方法中的變量a指向的A實例的age進行賦值,完成后形成的新的內存示意圖如下:


此時A實例的age值的變化是由test1方法引起的

(5):運行第4行,根據(jù)此時的內存示意圖,輸出test1方法中的age=20

(6):運行第11行,根據(jù)此時的內存示意圖,輸出main方法中的age=20

5:對上述例子的改變

理解了上面的例子,可能有人會問,那么能不能讓按照引用傳遞的值,相互不影響呢?就是test1方法里面的修改不影響到main方法里面呢?

方法是在test1方法里面新new一個實例就可以了。改變成下面的例子,其中第3行為新加的:

public class TempTest { 
 private void test1(A a){ 
 a = new A();//新加的一行 
 a.age = 20; 
 System.out.println("test1方法中的age="+a.age); 
 } 
 public static void main(String[] args) { 
 TempTest t = new TempTest(); 
 A a = new A(); 
 a.age = 10; 
 t.test1(a); 
 System.out.println(”main方法中的age=”+a.age); 
 } 
} 
class A{ 
 public int age = 0; 
} 

運行結果為:

test1方法中的age=20 
main方法中的age=10 

為什么這次的運行結果和前面的例子不一樣呢,還是使用內存示意圖來理解一下

6:再次理解按引用傳遞

(1):運行開始,運行第9行,創(chuàng)建了一個A的實例,內存分配示意如下:

(2):運行第10行,是修改A實例里面的age的值,運行后內存分配示意如下:

(3):運行第11行,是把main方法中的變量a所引用的內存空間地址,按引用傳遞給test1方法中的a變量。請注意:這兩個a變量是完全不同的,不要被名稱相同所蒙蔽。

內存分配示意如下:

由于是按引用傳遞,也就是傳遞的是內存空間的地址,所以傳遞完成后形成的新的內存示意圖如下:

也就是說:是兩個變量都指向同一個空間。

(4):運行第3行,為test1方法中的變量a重新生成了新的A實例的,完成后形成的新的內存示意圖如下:

(5):運行第4行,為test1方法中的變量a指向的新的A實例的age進行賦值,完成后形成的新的內存示意圖如下:

注意:這個時候test1方法中的變量a的age被改變,而main方法中的是沒有改變的。

(6):運行第5行,根據(jù)此時的內存示意圖,輸出test1方法中的age=20

(7):運行第12行,根據(jù)此時的內存示意圖,輸出main方法中的age=10

7:說明

(1):“在Java里面參數(shù)傳遞都是按值傳遞”這句話的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,所以統(tǒng)稱按值傳遞。

(2):在Java里面只有基本類型和按照下面這種定義方式的String是按值傳遞,其它的都是按引用傳遞。就是直接使用雙引號定義字符串方式:String str = “Java私塾”;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java面試為何阿里強制要求不在foreach里執(zhí)行刪除操作

    Java面試為何阿里強制要求不在foreach里執(zhí)行刪除操作

    那天,小二去阿里面試,面試官老王一上來就甩給了他一道面試題:為什么阿里的 Java 開發(fā)手冊里會強制不要在 foreach 里進行元素的刪除操作
    2021-11-11
  • Java接入支付寶授權第三方登錄的完整步驟

    Java接入支付寶授權第三方登錄的完整步驟

    不管是支付寶支付,還是微信支付,還是銀聯(lián)支付等,大部分的支付流程都是相似的,這篇文章主要給大家介紹了關于Java接入支付寶授權第三方登錄的相關資料,使用支付寶的沙盒環(huán)境示例,需要的朋友可以參考下
    2021-07-07
  • Java中Set集合轉為List集合常見的兩種方式

    Java中Set集合轉為List集合常見的兩種方式

    List是Java中比較常用的集合類,指一系列存儲數(shù)據(jù)的接口和類,可以解決復雜的數(shù)據(jù)存儲問題,這篇文章主要給大家介紹了關于Java中Set集合轉為List集合常見的兩種方式,需要的朋友可以參考下
    2023-12-12
  • 詳解jvm中的標量替換

    詳解jvm中的標量替換

    這篇文章主要介紹了詳解jvm中的標量替換,幫助大家更好的理解和使用Java虛擬機,感興趣的朋友可以了解下
    2020-09-09
  • 圖解Java排序算法之堆排序

    圖解Java排序算法之堆排序

    這篇文章主要為大家詳細介紹了Java經(jīng)典排序算法之堆排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java輸入時如何通過回車(enter)來結束輸入

    java輸入時如何通過回車(enter)來結束輸入

    這篇文章主要介紹了java輸入時如何通過回車(enter)來結束輸入,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java實現(xiàn)的圖片上傳工具類完整實例

    Java實現(xiàn)的圖片上傳工具類完整實例

    這篇文章主要介紹了Java實現(xiàn)的圖片上傳工具類,涉及java針對圖片文件的檢查、上傳、清除等相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • 利用java開發(fā)簡易版掃雷游戲

    利用java開發(fā)簡易版掃雷游戲

    這篇文章主要介紹了利用java開發(fā)一個丐版掃雷游戲,喜歡玩掃雷的小伙伴們一定要試試哦,對正在學習java開發(fā)的小伙伴們也有一定幫助,需要的朋友可以參考下
    2021-04-04
  • 關于Hibernate的一些學習心得總結

    關于Hibernate的一些學習心得總結

    Hibernate是一個優(yōu)秀的Java 持久化層解決方案,是當今主流的對象—關系映射(ORM)工具
    2013-07-07
  • Spring中的AutowireCandidateResolver的具體使用詳解

    Spring中的AutowireCandidateResolver的具體使用詳解

    這篇文章主要介紹了Spring中的AutowireCandidateResolver的具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論