易混问题总结---(by value VS by reference)

博客主要介绍了Java中传值与传址的不同。基本型别传递是传值,传入的是值的拷贝,不会影响原值;引用传递是传递引用的拷贝,在方法中对引用对象的改变会影响原对象。还通过具体代码示例展示了这两种传递方式的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传值与传址;
在java中基本型别的传递是通过传值完成的,因此在下面的例子中虽然在Atest()中改变了
传入的int i的值,但是并不会影响原来int i的值,简单点就是传入的int i的值的拷贝罢了
而引用(reference)的传递呢?就有点不同了,在Atest()中的改变影响了原来的对象是内容,
因为在java中reference的传递是by value的,也就是是说,是传递的reference的的拷贝,
+===========内存分配图============+

Object o1 = new Object();
Object o2 = new Object();
+----------此时,存储空间的分配----------+
内存分配图

o1=o2
+----------此时,存储空间的分配----------+
内存分配

此时,将o2的reference的值传递给了o1,因此,现在o1指向的对象是一开始o2指向的对象
了,如果现在改变o1的对象,那么对任何一个调用该对象的方法来讲都是可见的(当然了,o2指向的
也会相应改变了,同一个嘛),所以在下面的例子中:Atest()中po的改变在最后一个println()中表现了出来
+-------------------Example--------------------- ----------------+
import java.awt.Point;
class Passvalue
{
  public static void Atest(Point p,int i){
  p.setLocation(2,2);
  i=12;
  System.out.println("During Atest p = " +p+"/n and i = "+i);
}
public static void main(String arg[]){
  Point po = new Point(0,0);
  int j = 0;
  System.out.println("Before Atest p = " +po+"/n and i = "+j);
  test( po, j);
  System.out.println("After Atest p = " +po+"/n and i = "+j);
}
}
---------- output ----------
Before Atest p = java.awt.Point[x=0,y=0]
 and i = 0
During Atest p = java.awt.Point[x=2,y=2]
 and i = 12
After Atest p = java.awt.Point[x=2,y=2]
 and i = 0

输出完成 (耗时 0 秒) - 正常终止
+-------------------------------------------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值