美文网首页
关于Java对象作为参数传递是传值还是传引用的问题

关于Java对象作为参数传递是传值还是传引用的问题

作者: 白驹过隙_a | 来源:发表于2019-01-07 22:02 被阅读0次

前言
  在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响;若传的是引用,那么此时对形参的操作则会影响到实参。
  首先我们来看一句代码:

Object obj = new Object();
1
  这句话的意思是:创建一个Object对象,再创建一个名为obj的引用,让这个引用指向这个对象,如下图所示:

在有了上面的基础之后,我们便来看下面这组在网上很流行的例子:

基本数据类型作为参数传递:
例1:

public class test {
public static void main(String[] args) {
int i = 1;
System.out.println("before change, i = "+i);
change(i);
System.out.println("after change, i = "+i);
}
public static void change(int i){
i = 5;
}
}
1
2
3
4
5
6
7
8
9
10
11
  这个例子不难理解,当基本数据类型作为参数传递时,传递的是实参值的副本,即传的是值,无论在函数中怎么操作这个副本,实参的值是不会被改变的。所以以上代码执行的结果是:
  
  before change, i = 1
  after change, i = 1

对象作为参数传递:
  在下面的例2中,我们把StringBuffer对象作为参数传递到change函数。
  
  例2:

public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer.append("world !");
}
}
1
2
3
4
5
6
7
8
9
10
11
  为了方便推理出结论,我们先直接看程序的运行结果:
  
  before change, sb is Hello
  after change, sb is Hello world !
  
  从输出结果中我们可以发现,sb所指向的对象的值被改变了,那么是否我们可以推论出,在Java中,当对象作为参数传递时,传递的是该对象的引用呢?我们再来看下面这个例子:
  
  例3:

public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer = new StringBuffer("Hi ");
stringBuffer.append("world !");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
  如果上面的推论是正确的,即Java中对象作为参数传递,实际传递的是该对象的引用,那么在调用change函数之后,原对象的值应该是会改变的,变为“Hi world !”,但是,当我们运行程序后,结果却是如下所示:
  
  before change, sb is Hello
  after change, sb is Hello
  
  原对象的值并没有被改变,这与上面的推论相矛盾!为什么在Java中,当对象作为参数传递时,有的时候实参被改变了,而有的时候实参并未被改变呢?下面让我们来分析一下其中的原因:
  从文章的开头我们知道,当执行StringBuffer sb = new StringBuffer(“Hello “)时,我们创建了一个指向新建对象“new StringBuffer(“Hello “)”的引用“sb”,如下图所示:
  
  
  
  在例2中,当我们调用change函数后,实际上,形参stringBuffer也指向了实参sb所指向的对象,即:
  
  
  
  那么当我们执行stringBuffer.append(“world !”)后,便通过对象的引用“stringBuffer”修改了对象的值,使之变成了“Hello world !”,即:
  
  
  
  但是,在例3中的change函数中,我们又新建了一个对象“new StringBuffer(“Hi “)”(这实际上在内存中开辟了一块在原对象地址之外的新区域),这让形参stringBuffer实际指向了这个新建的对象,并将新对象的值设置为“Hi world !”,即:
  
  
  
  那么我们就不难理解,为何在执行完change函数之后,实参的值仍为“Hello”了。

结论
  综上所述,我们可以得出结论:在Java中,当对象作为参数传递时,实际上传递的是一份“引用的拷贝”。


作者:Alan_Xiang
来源:CSDN
原文:https://blog.csdn.net/xiangwanpeng/article/details/52454479
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • 第二部分:java类与对象

    关于Java对象作为参数传递是传值还是传引用的问题 Java中@Override的作用 Java 访问权限修饰符p...

  • 关于Java对象作为参数传递是传值还是传引用的问题

    前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,...

  • JAVA是按值传递还是按引用传递

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用...

  • call by value or reference ?

    Java中参数传递是传值还是传引用呢?很多人遇到这个问题都会马上给你抛出这个例子: 运行结果: before:a=...

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

  • java中的参数传递(只有值传递没有引用传递)

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原...

  • 解决java中的参数传递问题

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原...

  • 2018-11-04-2

    java参数传递(最后一遍梳理) 总结如下: 对象就是传引用 原始类型就是传值 如String等immutable...

  • python语言那些...

    值传递还是引用传递引用传递,只是在遇到传递不可变对象时像值传递。对于不可变对象的函数传参,依然是传的引用(地址)。...

  • Python 函数中,参数是传值,还是传引用?

    Python 函数中,参数是传值,还是传引用? 代码示例 在 C/C++ 中,传值和传引用是函数参数传递的两种方式...

网友评论

      本文标题:关于Java对象作为参数传递是传值还是传引用的问题

      本文链接:https://www.haomeiwen.com/subject/odzprqtx.html