美文网首页
Java中的值传递和引用传递

Java中的值传递和引用传递

作者: RavenX | 来源:发表于2018-05-18 16:37 被阅读0次

所有博文已迁移至个人网站:http://ravenxrz.ink,请勿再留言评论,本文新链接:http://ravenxrz.ink/2019/05/03/value-and-reference-passing-in-java.html

0.前言

被java中的“值传递”和“引用传递”困扰过一阵子,在实际代码中也犯过不少错,记录一下,方便查看。

1.问题

首先看看代码:

public class Test {
     public static void main(String[] args) {
            String str = "123";
            System.out.println(str);
            change(str);
            System.out.println(str);
        }
    public static void change(String str){
            str = "456";
    }
}

那么你觉得会输出多少呢?至少我曾经觉得是:

123
456

但是,正确答案是:

123
123

这是为什么呢?我相信答错的同学大都是受到了一些”java教材“的影响--java的参数传递有两种:

  1. 值传递,传递值,在函数中形参发生的变化不影响实参。
  2. 引用传递,传递对象引用,在函数中形参发生的变化影响实参。

然而,实际上java参数传递只有一种情况,那就是值传递。所不同的是,一般说的"引用传递",在实际中传递的不过是引用对象的地址值

在解释上述代码前,先要在补充一点知识:

String a = new String("123");
String b;
b= new String("123");

两种形式的代码所形成的的结果是完全一致的,后面一种更容易理解java中的引用与对象的具体含义。先声明一个String对象的引用,再new一个“123”对象,最后将这个对象赋值(等号=)给该引用

  1. b:对象的引用
  2. “123”:实际对象

好了,现在来具体解释一下值传递地址值引用吧。

1.值

int a = 1;
void f(int b){
  b =2;
}

a是多少呢?肯定是1嘛。

image.png

将a的值1传递给b,b的值为1.这样不论b如何更改,并不影响a的值。

2.地址值

String a = new String("123";)
void main(String b){
  b = new String("345");
}
image.png
首先,a将对象“123”的地址值传递给b,b指向"123"的地址

之后 new了一个"345"对象,b重新指向了"345",也就是下图。

image.png
所以,仅仅是b的引用对象发生了变化,a的引用对象毫无改变。
现在能够解释文首的问题了。But,there is one more thing.

如下代码:

public class Test {
     public static void main(String[] args) {
         StringBuilder a = new StringBuilder("123");
         change(a);
         System.out.println(a);
        }
    public static void change(StringBuilder str){
            str.append("345");
    }
}

现在,a的值是多少?

答案是:

123345

这也就是平常我们所理解的,传递“引用”会影响原对象本身。还是画个图来解释:


image.png

首先a将“123”对象的地址传递给b,b指向“123”,接着通过“绿色”引用改变了“123”对象。因为a也是指向“123”对象,所以输出a也变为了"123345"。

That's all.Hope you have understood。

相关文章

  • 自整理3 值传递和引用传递

    java的值传递和引用传递 首先,由于java没有指针机制,所有java归根究底只有值传递,没有引用传递。java...

  • Java Lambda表达式引用局部变量的原理

    规则1 Java中变量分为:基本类型变量和引用类型变量 规则2 Java方法传参只有值传递,没有引用传递,传递的值...

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

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

  • Java 参数的传递

    Java 的参数是值传递,不是引用传递 Java 中只有值传递,方法按值调用(call by value)。也就是...

  • Java的引用

    参考链接: Java到底是值传递还是引用传递 Java的四种引用方式 Java中的强引用、软引用、弱引用和虚引用 ...

  • [译] Java 值传递 VS 引用传递

    Java是值传递还是引用传递一直都有争论,我们最终下个结论,Java是值传递而不是引用传递。如果Java是引用传递...

  • Java面试题疑难点

    1. java值传递和引用传递 String为什么是值传递而不是引用传递 答:String是final的

  • Java 与值传递

    问: 什么是值传递?什么是引用传递?为什么说 Java 中只有值传递? 一、值传递与引用传递 实参与形参: 实际参...

  • 聊聊Java内部类

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

  • Java 浅拷贝和深拷贝

    java中传递为值传递,对于引用类型,改变值后,原对象及引用对象值将都改变,最近刚好看java中浅拷贝和深拷贝问题...

网友评论

      本文标题:Java中的值传递和引用传递

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