传址还是传值

    Java里在使用对象的时候,是传址还是传值呢?看看这句经典名言: O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"从这句话可以看出,java应该是传址调用的(如果想深入了解的话,可以了解一下java虚拟机规范关于基本数据类型和复合数据类型(也就是对象)在栈和堆中的存储方式,以加深理解)。

我们也可以自己做个小实验:

本数据类型比较简单,因为数据存储空间比较小,每个不同的基本数据类型都有单独的存储空间,比如i=1b=1ab是指向同一空间的。如果b=2了,那就新开一个空间,在把b指向这个位置。 

对象的情况如下:

User u1=new User();

System.out.println(u1);

User u2=new User();

System.out.println(u2);

User u3=u1;

System.out.println(u3);

输出: 

com.springMVC.entity.User@a62fc3

com.springMVC.entity.User@89ae9e

com.springMVC.entity.User@a62fc3

从以上的输出可以看到,java是传址调用的。

 

但是String是一个特殊的对象,他生成方式象对象,但是存储方式又像基本数据类型。

String str1="11111";

System.out.println(str1.hashCode());

String str2="22222";

System.out.println(str2.hashCode());

String str3="11111";

System.out.println(str3.hashCode()); 

输出:

3541024

3541025

3541024

从输出数据可以看到,str1没有附值给str3,但是str1str3指向的位置是一样的。为什么会怎样,因为存储方式跟基本数据类型是一样的,str1生成的时候,内存分配了位置保存“11111”,当str3生成的时候,java虚拟机会在内存中查找是否已经有“11111”,如果有他就将str3指向这个位置,如果没有,就新生成一个。

 

在函数中使用传址(引用)还是值,定义按值传递和按引用传递这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

    上面的这些是很重要的,请大家注意以下几点结论,这些都是我认为的上面的文章中的精华和最终的结论:

1、对象是按引用传递的,

2、基本数据类型是按值传递(包括特殊的对象String),

3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本,原来值不会变。

4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本,对象的内容会变。

 多于2个Bay被计划, 请联系EC处理=\u591a\u4e8e2\u4e2aBay\u88ab\u8ba1\u5212, \u8bf7\u8054\u7cfbEC\u5904\u7406
多于2個Bay被計劃, 請聯系EC處理=\u591a\u4e8e2\u500bBay\u88ab\u8a08\u5283, \u8acb\u806f\u7cfbEC\u8655\u7406

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值