java中对象作为参数_在Java与C++中对象作为参数传递的不同

问题源于在Java中使用对象作为参数,按照C++的思路进行调试,发现结果与C++中并不相同。

导致该问题的原因是Java与C++对于对象的解释是不相同的。

在C++中对象作为参数采用的是“传值调用”,当实参通过形参传递时,会调用对象(实参)的拷贝构造函数(如果没有显式的定义拷贝构造函数,将自动调用默认拷贝构造函数,它的功能是将实参中的对象原样的拷贝到形参中,这里牵扯到深拷贝和浅拷贝的问题,但不影响对本问题的分析。),函数实际操作的是该对象的拷贝,并不影响原对象。

而在Java中,对象作为参数时,形参是被初始化为实参对象的引用。如果对形参进行操作会影响到实参(原对象)。这有点类似于C++中的”引用调用“,但并非如此,Java中采用的仍然是”传值调用“。而导致结果不同的原因是,Java与C++中对对象名的解释是不同的。在C++中“类”和“对象”的关系可以类比为“类型”和“变量”之间的关系,对象在定义的时候即分配了内存空间,它是实实在在存在的。而在Java中,对象定义时只是定义了“对象变量”,它只是指向一个对象,当使用new操作符时才会构造指向的这个对象。Java中的对象名有点像C++中指向对象的指针,当作为参数传递时,传递的是该对象在内存中的地址。

在C++和Java中String类的对象str的存储方式分别如下:

a989957f7d56ae5825f8240f99e4c3d9.png

以Java中对象作为参数传递的例子分析一下:

1 public classTest1 {2 public static voidmain(String[] args) {3 StringBuffer str = new StringBuffer("Hello ");4 System.out.println("Before change, str = " +str);5 changeData(str);6 System.out.println("After changeData, str = " +str);7 }8

9 public static voidchangeData(StringBuffer strBuf) {10 strBuf.append("World!");11 }12 }

按照上面的分析,将str传递给strBuf 时,是将Hello存储的地址传递过去,那么输出结果是:

Before change, str =Hello

After changeData, str= Hello World!

将上面的代码修改一下,如下:

1 public classTest2 {2 public static voidmain(String[] args) {3 StringBuffer str = new StringBuffer("Hello ");4 System.out.println("Before change, str = " +str);5 changeData(str);6 System.out.println("After changeData, str = " +str);7 }8 9 public static voidchangeData(StringBuffer strBuf) {10 strBuf = new StringBuffer("Hi ");11 strBuf.append("World!");12 }13 }

按照上面的分析,将str传递给strBuf 时,strBuf 与str都将存放Hello的存储地址,如下图:

785496b5dee5e70ef601b36144238df7.png

然后当执行完 strBuf = new StringBuffer("Hi "); 后,以上关系将变成:

e724f47c3ea2cb4a80cd42a6080f62e1.png

此时strBuf 中存放的不再是Hello的地址,而是Hi的地址,new操作符操作成功后总会在内存中新开辟一个存储区域。

当执行 strBuf.append("World!"); 这句时,此时操作的将是Hi,而不是Hello,那么结果将变成:

e40a83fa5cbe6234c6d70977a8155bb1.png

最后输出结果如下:

Before change, str =Hello

After changeData(n), str= Hello

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值