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

Java的引用传递和值传递

作者: 假鞋子 | 来源:发表于2017-05-17 22:25 被阅读0次

首先,Java中并不存在指针,但有类似的现象,叫“引用传递”。
一部分人觉得java中存在【引用传递】和【值传递】,而也有一部分人认为java中只存在【值传递】。他们表达的意思是一样的,却是从两个方面来表达。
首先java中的确存在两种情况。下面来看一个例子;

public class Test {
    public static void change(int a){
        a=50;
    }
    public static void main(String[] args) {
        int a=10;
        System.out.println(a);
        change(a);
        System.out.println(a);
    }
}

输出:10,10
可见change方法并没有改变main中的a的值。
这里传递到change中的a是一个拷贝,对原来的值不产生影响。


再看:

public class Test3 {
    public static void change(int []a){
        a[0]=50;
    }
    public static void main(String[] args) {
        int[] a={10,20};
        System.out.println(a[0]);
        change(a);
        System.out.println(a[0]);
    }
}

输出:10,50;
可见这里的change方法改变了main中的a,
这里传递到change中的a是一个地址的值,指向原来的值。

<br />

深入


我们来看下面的例子:

作者:Intopass
链接:https://www.zhihu.com/question/31203609/answer/50992895
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第一个例子:基本类型
void foo(int value) {
    value = 100;
}
foo(num); // num 没有被改变

第二个例子:没有提供改变自身方法的引用类型
void foo(String text) {
    text = "windows";
}
foo(str); // str 也没有被改变,也因为每一个"xxx"都是一个新的对象

第三个例子:提供了改变自身方法的引用类型
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder.append("4");
}
foo(sb); // sb 被改变了,变成了"iphone4"。

第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
}
foo(sb); // sb 没有被改变,还是 "iphone"。

这里有些人可能对图四难以理解,为什么foo方法中对传入的sb做了赋值,但是sb还是没有改变呢?
那我们再来看看下面的例子和相应的内存模型:

public static void main(String[] args) {
    Demo d1 = new Demo();
    fun(d1);
);
}
public void fun(Demo d2){
    xxxx;
}
d1、d2内存模型

这里我们发现,当调用fun方法的时候,栈内存中出现了d2值,指向了d1指向的空间。
这也就解释了上面第四个例子:当调用foo方法传入d1时,实际上是在栈内存中新增了d2值,同时d2指向d1指向的堆内存空间。当foo方法内部进行新的【赋值】操作时,实际上改变了的是d2的指向,并不会改变d1的值。

这里我们需要注意的一点是d2的赋值是改变其指向的位置。而不是改变指向位置的值。

相关文章

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

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

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

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

  • Java面试题疑难点

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

  • 聊聊Java内部类

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

  • Java值传递、数据加密

    值传递 Java 基本类型值传递,引用类型值传递 内存图解:

  • 快速区别值传递和引用传递

    复习Java知识的时候又看到值传递和引用传递的区别,然后就查询一下,结果都是Java到底是值传递还是引用传递之争,...

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

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

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

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

  • Java值传递

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值...

  • Java的引用

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

网友评论

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

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