java中的值传递和引用传递

方法调用是编程语言中非常重要的一个特性,在方法调用时,通常需要传递一些参数来完成特定功能。

我们首先观察一个简单的例子:

public   class Test extends A {
    public static void main(String []args){
        String str1 = "A";
        StringBuffer str2 = new StringBuffer("B");
        setValues(str1,str2);
        System.out.println("str1="+str1);
        System.out.println("str2="+str2);
    }
    
    static void setValues(String str1,StringBuffer str2){
        str1 = "hello";
        str2 = str2.append("hello word");
    }
}

运行的结果如下:

str1=A
str2=Bhello word

是不是和我们之前的预想有一定的差距?接下来我们慢慢来弄懂为什么会是这个样子的。首先我们需要了解两个概念:

值传递

<strong>在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个零食的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。</strong>

引用传递

<strong>在方法调用中,传递的是对象(也可以看做是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改会影响实参的值。</strong>r

明白了上面的两个概念之后,我们用一幅图来表示上面程序参数的改变过程。(在java中String对象是值传递,StringBuffer是应用传递,后面会有介绍。)

值传递和引用传递的区别1.jpg

为了方便理解,假设str1和str2的存储单元分别为0xfffffff1和0xfffffff2。在调用方法setValues()时,String传递的是一个值,此时修改的是传递过来的副本的值,并不会影响到str1的值。而str2传递的是引用,在setValues方法修改该值的方法,会直接影响到其值。具体可以参加示意图。
java中处理8中基本的数据类型用的是值传递,其他的所有类型都是引用传递。下面列出这8中基础的数据类型。

数据类型 字节长度 范围 默认值 包装类
int 4 [-231~231-1] 0 Integer
short 2 [-32768~32767] 0 Short
long 8 [-263~263-1] 0L或者ol Long
byte 1 [-128~127] 0 Byte
float 4 32位IEEE754单精度范围 0.0F或者0.0f Float
double 8 32位IEEE754双精度范围 0.0 Double
char 2 [0,65536] u0000 Characher
boolean 1 true/false false Bollean

但是需要注意的是,8中基本数据类型的包装类都是不可变量,但是都是按引用传递。

        Integer a=1;
        Integer b=a;
        b++;
        System.out.println(b);

在上面的实例中,会输出2.但是别误会。由于Integer是不可变类,因此没有提供改变他值的方法,这里的b在执行完b++语句后,此时会创建一个新的值为2的Integer赋值给b,此时b和a其实已经没有任何关系了。所以Integer其实质还是按引用传递,不要被上面的表象模糊了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容