自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java參數(shù)按值傳遞?按引用傳遞

開發(fā) 后端
有時候在想,java在調(diào)用方法時候究竟是按值傳遞還是按引用傳遞,之前有人說是基本數(shù)據(jù)類型按值傳遞,引用類型按引用傳遞。一時間,似乎都有道理。

有時候在想,java在調(diào)用方法時候究竟是按值傳遞還是按引用傳遞,之前有人說是基本數(shù)據(jù)類型按值傳遞,引用類型按引用傳遞。一時間,似乎都有道理。

筆者在此不追究字眼上的辨別識字能力,把自己對這個問題的理解闡述一下,筆者不想說這是按值傳遞還是按引用傳遞,自己理解就好了吧,畢竟java會用才是王道。

先看一下下面的代碼:

 

  1. package shb.java.testmemory; 
  2.  
  3. public class TestMeo { 
  4.  
  5.     /**測試基本數(shù)據(jù)類型以及引用類型參數(shù)按值傳遞 
  6.      * @Description: 
  7.      * @author shaobn 
  8.      * @param args 
  9.      * @Date:2015-9-8 上午7:53:56  
  10.      */ 
  11.     public static void main(String[] args) { 
  12.         // TODO Auto-generated method stub 
  13.         testInt(); 
  14.         testStr(); 
  15.         testPack(); 
  16.         testObj(); 
  17.         testObj_2(); 
  18.     } 
  19.     //NO1.測試基本數(shù)據(jù)類型 
  20.     public static void testInt(){ 
  21.         int num1 = 12
  22.         System.out.println("Before change::"+num1); 
  23.         changeInt(num1); 
  24.         System.out.println("After change::"+num1); 
  25.     } 
  26.     //測試字符串類型 
  27.     public static void testStr(){ 
  28.         String str = "helloworld"
  29.         System.out.println("Before change::"+str); 
  30.         changeStr(str); 
  31.         System.out.println("After change::"+str); 
  32.          
  33.     } 
  34.     //測試包裝類型 
  35.     public static void testPack(){ 
  36.         Integer integer = new Integer(42); 
  37.         System.out.println("Before change::"+integer); 
  38.         changePack(integer); 
  39.         System.out.println("After change::"+integer); 
  40.     } 
  41.     //測試引用類型 
  42.     public static void     testObj(){ 
  43.         Person person = new Person(); 
  44.         System.out.println("Before change::"+person.age); 
  45.         changeObj(person); 
  46.         System.out.println("After change::"+person.age); 
  47.     } 
  48.     //測試引用類型方式二 
  49.     public static void     testObj_2(){ 
  50.         Person person = new Person(); 
  51.         System.out.println("Before change::"+person.age); 
  52.         changeObj_2(person); 
  53.         System.out.println("After change::"+person.age); 
  54.     } 
  55.     public static void    changeInt(int num){ 
  56.         num = 21
  57.     } 
  58.     public static void     changeStr(String str){ 
  59.         str = "hellobeijing"
  60.     } 
  61.     public static void     changePack(Integer integer){ 
  62.         integer = new Integer(89); 
  63.     } 
  64.     public static void     changeObj(Person person){ 
  65.         person.age = 87;     
  66.     } 
  67.     public static void     changeObj_2(Person person){ 
  68.         person = new Person(); 
  69.         person.age = 78
  70.     } 
  71. //引用類型測試類 
  72. class Person{ 
  73.     public  int age = 78

Look NO1:

    

 

    [[148217]]

說明一下:筆者在上面畫的兩張圖著實不咋樣,只能做到這種程度了。我們分析一下:當數(shù)據(jù)為基本數(shù)據(jù)類型時,我們傳給形參的僅僅是一個實參的副本(Copy),當然由于棧內(nèi)存變量共享的特征,這兩個變量共同指向此變量值。

當我們對形參進行改變時,首先,在棧內(nèi)存中會尋找是否存在新的變量值,如果有,則指向新的變量值(體現(xiàn)棧內(nèi)存數(shù)據(jù)共享的特點)。如果沒有的話,在棧內(nèi)存中回開辟一塊空間,存儲新的變量值,同時形參變量會指向新的變量值。

此時我們發(fā)現(xiàn),這時的變量值已經(jīng)與實參的變量沒有關系,兩個獨立的變量。所以經(jīng)過函數(shù)后改變的變量值與之前的沒有關系,故輸出的還是之前的變量值。

另外,我們看到,當傳遞對象的引用時,person引用變量中存儲的是Person對象在堆內(nèi)存中的內(nèi)存地址,所以傳遞的是內(nèi)存地址(筆者理解為是一串數(shù)字)。此時兩個形參變量是有共同的內(nèi)存地址值,所以指向同一個內(nèi)存對象。我們觀察

發(fā)現(xiàn),當我們改變對象中的屬性值時,有牽一發(fā)而動全身的感覺,只要你改變這個對象,這個對象就被改變,而不存在另外開辟一個對象的概念(String類型和包裝類型除外)。

PS:還沒有寫完,正在上班時間,晚上再寫吧!

如有錯誤,請大家?guī)兔m正一下。

責任編輯:王雪燕 來源: 博客園
相關推薦

2022-07-29 08:05:31

Java值傳遞

2009-08-17 14:48:44

Java參數(shù)傳遞機制

2019-04-17 13:48:19

JavaScript前端傳遞

2012-02-21 14:04:15

Java

2016-09-18 19:07:33

Java值傳遞引用傳遞

2023-11-15 09:14:27

Java值傳遞

2024-09-04 01:36:51

Java對象傳遞

2020-09-02 08:00:51

Java引用傳遞值傳遞

2017-12-05 08:53:20

Golang參數(shù)傳遞

2022-11-02 15:00:03

Java值傳遞引用傳遞

2010-07-26 13:13:33

Perl函數(shù)參數(shù)

2011-03-25 13:44:28

Java值傳遞

2021-04-13 07:51:24

JavaScript引用傳遞

2009-09-04 11:00:13

通過C#引用傳遞

2024-12-09 09:00:00

拷貝構(gòu)造函數(shù)傳遞編程

2009-09-09 11:07:52

LINQ to SQL

2023-03-29 23:23:00

MyBatis參數(shù)框架

2010-09-10 09:55:13

SQL參數(shù)變量

2023-11-29 09:47:11

C++對象

2025-02-12 10:51:51

點贊
收藏

51CTO技術棧公眾號