为什么Java只有值传递

文章优先发布在个人博客,后续如果修改忘记同步到CSDN给你带来不便,抱歉。
个人博客本文地址:https://www.xdx97.com/article?bamId=671021641165176832



其实我在学Java的时候对值传递地址值传递这两个概念没啥感觉
也可能是我自己没太注意,但是在学习c语言的时候对这两个概念倒是印象深刻


下面就我对这两个概念的理解来阐述一下:为什么Java只有值传递

1、什么是形参什么是实参

    // 这个参数xdx 就是形参
    public void fun(XdxTest xdx){
        System.out.println("say : " + xdx);
    }

    public static void main(String[] args) {
        XdxTest t = new XdxTest();
        // 这个地方传递的t 就是实参
        t.fun(t);
    }

2、什么是值传递什么是地址值传递

值传递:形参所作的任何改变都不会对实参有任何影响。

你可以这样理解,我有一把钥匙,然后我配了一把,我把配的一把给你了。
你对我给你的钥匙做任何操作,比如折断。对于我手里的钥匙是没有任何影响的。


地址值传递:形参做任何操作都会影响到实参的。

我直接把原配的钥匙给了你,如果你把它折断的话,对我肯定有影响啦。


3、Java中的引用传递

通过上面的解释我们很容易就理解的值传递地址值传递,我们常说Java中只有值传递,但是为什么在Java中我们对形参做改变的时候(比如重新赋值),对实参还是有影响呢?

比如下面这个代码:

public class XdxTest {
    private int count = 1;
    // 这个参数xdx 就是形参
    public void fun(XdxTest xdx){
        xdx.count = 2;
    }
    public static void main(String[] args) {
        XdxTest t = new XdxTest();
        System.out.println(t.count);
        // 这个地方传递的t 就是实参
        t.fun(t);
        System.out.println(t.count);
    }
}

# 打印结果
1
2

我们传递过去的参数,不是当前对象,而是该对象的一个引用,它也是指向当前对象的。

对象和对象的引用:一个对象可以有多个引用,对于和对象的引用就像气球和绳子之前的关系一样。

所以我们对这个对象的引用做的任何操作当然会反应到对象本身呀。

但是如果我们在方法里面,让这个对象引用指向其它对象,这时候再对引用做任何操作就不会对实参有任何改变了。这也就证明了Java里面的引用传递本质上还是值传递

public class XdxTest {
    private int count = 1;
    // 这个参数xdx 就是形参
    public void fun(XdxTest xdx){
        xdx = new XdxTest();
        xdx.count = 2;
    }
    public static void main(String[] args) {
        XdxTest t = new XdxTest();
        System.out.println(t.count);
        // 这个地方传递的t 就是实参
        t.fun(t);
        System.out.println(t.count);
    }
}

打印结果:
1
1


可以关注我的个人公众号,一起成长噢:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/104088045
今日推荐