java 传递对象_java中的对象传递

本文解析了Java中值传递与引用传递的区别,强调了基本类型(如int)的值传递与引用类型(如String)通过引用传递对象地址的概念。通过实例和代码,揭示了`=`运算符在两者中的作用,并澄清了一个常见的关于方法参数传递的误解。最后总结了实际过程和注意事项,指出Java中对象传递实际上是副本,而非对象本身。
摘要由CSDN通过智能技术生成

java的值传递和引用传递

一:搞清楚 基本类型 和 引用类型的不同之处

int num = 10;

String str = "hello";

a283c871550cd7bfa69ab24a28559548.png

如图所示,num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。

二:搞清楚赋值运算符(=)的作用

num = 20;

str = "java";

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。

对于引用类型

str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。

如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)

7a5c5d559e9b74b9b725d4e00ece2d23.png

一个段有趣和令人困惑的代码

1 public static voidmain(String[] args){2 String str = new String("ab");3 change(str);4 System.out.println(str);5 }6

7 public static voidchange(String str){8 str = "cd";9 }

结果为:ab

常见的困惑问题

x存储指向堆中的“ab”字符串的引用。所以,当x被作为参数传递到change()方法时,它仍然指向堆中“ab”,像下面这样:

99fa3304f73074c911a02db5576e2366.png

因为java是按值传递的(pass-by-value), x的值是“ab”的引用。当方法的change()被调用,它会创建一个新的“cd”的对象,而x现在是指向“cd”像下面这样:

7b0594ce088052deed5f7d897abd0017.png

这似乎是一个相当合理的解释。他们明确表示,Java是总是传递按值。但是,错在哪里呢?

代码真正做了些什么呢?

上面的解释有几个错误。为了容易理解这一点,这是一个好主意,简单地描述整个过程。

当字符串“ab”被创建,java分配存储字符串对象所需的内存空间。然后,将对象分配给变量x,该变量是被实际分配的引用对象。此引用是该对象被存储在内存的地址。

变量x包含一个字符串对象的引用。 x不是引用本身!它是用于存储一个引用(内存地址)的变量。

Java是仅仅是按值传递。当x传递给change()方法,x的(引用)值的副本被传递。方法change()创建另一个对象“cd”,它有一个不同的引用。它是被改变的x副本指向“cd”的变量,而不是x引用本身。

下面的图表展现了真实的过程:

89431591810da3690cd14dbc88bf99c4.png

总结:实际上JAVA在方法里传递的只是对象的副本。

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.

引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。

一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值