最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1:按值傳遞是什么

指的是在方法調(diào)用時,傳遞的參數(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就是按值傳遞 
} 
} 

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

示例如下:

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); 
} 
} 

運行結(jié)果是:

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

2:按引用傳遞是什么

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

示例如下:

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:按引用傳遞的重要特點

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

示例如下:

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; 
} 

運行結(jié)果如下:

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

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

要想正確理解按引用傳遞的過程,就必須學會理解內(nèi)存分配的過程,內(nèi)存分配示意圖可以輔助我們?nèi)ダ斫膺@個過程。

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

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


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


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

內(nèi)存分配示意如下:


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


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

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


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

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

(6):運行第11行,根據(jù)此時的內(nèi)存示意圖,輸出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; 
} 

運行結(jié)果為:

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

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

6:再次理解按引用傳遞

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

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

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

內(nèi)存分配示意如下:

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

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

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

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

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

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

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

7:說明

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

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

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

相關(guān)文章

  • Spring IoC容器知識點詳解

    Spring IoC容器知識點詳解

    在本篇文章里小編給各位整理的是關(guān)于Spring IoC容器的相關(guān)知識點內(nèi)容,有需要的朋友們可以學習下。
    2019-09-09
  • 使用Java操作TensorFlow的方法

    使用Java操作TensorFlow的方法

    TensorFlow是一個功能強大且廣泛使用的框架,它不斷得到改進,并最近被引入新語言包括Java和JavaScript,這篇文章主要介紹了如何使用Java操作TensorFlow,需要的朋友可以參考下
    2023-05-05
  • java圖像處理之倒角距離變換

    java圖像處理之倒角距離變換

    這篇文章主要為大家詳細介紹了java圖像處理之倒角距離變換的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • spring cloud gateway請求跨域問題解決方案

    spring cloud gateway請求跨域問題解決方案

    這篇文章主要介紹了spring cloud gateway請求跨域問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • mybatis中延遲加載Lazy策略的方法

    mybatis中延遲加載Lazy策略的方法

    這篇文章主要介紹了mybatis中延遲加載Lazy策略,需要的朋友可以參考下
    2018-06-06
  • MybatisPlus批量保存原理及失效原因排查全過程

    MybatisPlus批量保存原理及失效原因排查全過程

    這篇文章主要介紹了MybatisPlus批量保存原理及失效原因排查全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java Map所有的值轉(zhuǎn)為String類型

    Java Map所有的值轉(zhuǎn)為String類型

    本文主要介紹了Java Map所有的值轉(zhuǎn)為String類型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • Mybatis -如何處理clob類型數(shù)據(jù)

    Mybatis -如何處理clob類型數(shù)據(jù)

    這篇文章主要介紹了Mybatis 如何處理clob類型數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java 如何從字符串里面提取時間

    java 如何從字符串里面提取時間

    這篇文章主要介紹了java實現(xiàn)從字符串里面提取時間的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java編程經(jīng)典小游戲設(shè)計-打磚塊小游戲源碼

    Java編程經(jīng)典小游戲設(shè)計-打磚塊小游戲源碼

    這篇文章主要介紹了Java編程經(jīng)典小游戲設(shè)計-打磚塊小游戲源碼,還是挺不錯的,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

开江县| 湘阴县| 平顶山市| 田阳县| 江门市| 呼图壁县| 延川县| 安福县| 临泉县| 岳阳市| 双流县| 浮山县| 额尔古纳市| 平顺县| 秦安县| 喜德县| 兴安县| 龙海市| 鸡西市| 永仁县| 宁武县| 广宁县| 海伦市| 同德县| 仙桃市| 怀宁县| 乌鲁木齐县| 板桥市| 新乡市| 尚义县| 交城县| 河间市| 青川县| 清水县| 铜鼓县| 永和县| 八宿县| 清苑县| 唐海县| 聂拉木县| 西城区|