Java中是值传递


Java中只有值传递

今天看了一篇博客,对java中的参数传递有了进一步的认识。

之前的错误认识:传递的参数如果是普通类型,就是值传递;如果是对象,就是引用传递。

值传递与引用传递

值传递:调用函数时将实参复制一份传递给函数,如果后续在函数中对这个参数进行了修改,不会影响被复制的实参。
引用传递:调用函数时直接把实参的地址传递给函数,如果后续在函数中对这个参数进行了修改,将直接影响到被传递的实参。

假设有一个对象:

class User {

    public int id;

    public String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

之前会迷惑人的例子,乍一看是引用传递:

public class Value {

    public static void main(String[] args) {
        User mainUser = new User(1, "yuyang");
        System.out.println(mainUser);
        Value value = new Value();
        value.change(mainUser);
        System.out.println(mainUser);
        System.out.println(mainUser.id + mainUser.name);
    }

    public void change(User user) {
        user.name = "zgxh";
        System.out.println(user);
    }
}

输出:

test.User@5594a1b5
test.User@5594a1b5
test.User@5594a1b5
1zgxh

然而并不是真的引用传递。下面的例子说明虽然传递了对象,但没改变被传递变量:

public class Value {

    public static void main(String[] args) {
        User mainUser = new User(1, "yuyang");
        System.out.println(mainUser);
        Value value = new Value();
        value.change(mainUser);
        System.out.println(mainUser);
        System.out.println(mainUser.id + mainUser.name);
    }

    public void change(User user) {
        user = new User(2, "zgxh");
        System.out.println(user);
    }
}

输出:

test.User@5594a1b5
test.User@6a5fc7f7
test.User@5594a1b5
1yuyang

总结:Java中只有值传递,对于对象参数,值的内容是对象引用的地址。


文章作者: Yu Yang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yu Yang !
 上一篇
计算机网络复习 计算机网络复习
计算机网络复习IP协议 多HTTP请求问题 收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢? 答:前提条件:从HTTP/1.1开始,TCP连接是默认持续连接的,首部字段
2020-03-02
下一篇 
操作系统复习 操作系统复习
操作系统知识点复习 操作系统之进程与线程进程进程控制块PCB:系统为每个运行的程序配置的数据结构,用来描述进程的各种信息(代码存放位置等)。操作系统通过PCB来管理进程。进程实体:由程序段、数据段、PCB三部分组成。其中PCB是进
2020-02-16
  目录