Java中的传值,是值传递还是引用传递?

结论:

Java中的传值是值传递,准确的说,传递的值是对象的引用。

解析

在Java中基础数据类型是值传递(不会修改原始值),这个是普遍认为的。但是对于对象来说,大多数的人都认为是引用传递,这其实是不严谨的。下面我将会用例子来进行说明。

下面这个例子会让大多数的人认为,Java中对象的传递就是引用传递,毕竟修改了原始对象中的数据嘛。

java 复制代码
public class ReferenceDemo {

    public static void main(String[] args) {

        User user = new User();
        user.setUserName("张三");
        user.setAge(73);
        System.out.println("变化前:userName-->"+user.getUserName()+",age-->"+user.getAge());
        editUser(user);
        System.out.println("变化后:userName-->"+user.getUserName()+",age-->"+user.getAge());
    }

    private static void editUser(User user){
        user.setUserName("李四");
        user.setAge(84);
    }
}

对应的输出结果如下:

user中的值确实发生了变化,所以就认为Java中对象的参数传递方式就是引用传递。

当然我们可以用一种比喻来形容一下上面的情况。你拿着你家的钥匙找到我,我把你的钥匙复制了一个,然后我去你家把你的ps5给干碎了,然后我出去了,等你回家的时候你发现,你的ps5已经碎的完完的了。

下面我们来看另一种情况。

java 复制代码
public class ReferenceDemo {

    public static void main(String[] args) {

        User user = new User();
        user.setUserName("张三");
        user.setAge(73);
        editUser(user);
        System.out.println("调用方法之后的user:userName-->"+user.getUserName()+",age-->"+user.getAge());
    }

    private static void editUser(User user){
        user = new User();
        user.setUserName("李四");
        user.setAge(84);
        System.out.println("调用方法重新赋值之后的user情况:userName-->"+user.getUserName()+",age-->"+user.getAge());
    }
}

看上面的代码,我在editUSer()方法里面修改了user的值,但是是先把user重新new了一遍,然后打印一下user的值,然后在main方法里面调用完之后打印一下user的情况。下面我们看一下结果。

我们可以看到在editUser()方法中的user的值确实发生了变化,但是main方法打印的还是最开始的值----张三。 由此我们可以看出,在调用方法里面重新new一个对象的时候修改值,并不会修改原来的对象的值。这是为什么呢?

因为,传递的值是对象的引用,当new一个对象之后,引用关系就发生了变化,在editUser()方法中user的引用就换成了新的对象引用,而进行的变更也不会作用于原来的对象了。

这就好比我复制了你家的钥匙,然后把我造了一个和你家一样的房子,我进去之后一顿打砸,但是呢,打砸的其实是我的家,你的家还是完好无损。

所以这种传递方式也可以称为,共享对象传递。所以得出结论就是Java中的参数传递方式是值传递,而传递的内容就是对象的引用。

相关推荐
程序猿_极客1 小时前
【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)
java·开发语言·windows·macos·jdk
猫头虎1 小时前
macOS 双开/多开微信WeChat完整教程(支持 4.X 及以上版本)
java·vscode·macos·微信·编辑器·mac·脚本
二哈喇子!4 小时前
Java开发工具——IDEA(修改全局配置,提升工作效率)
java·编辑器·intellij-idea
强子感冒了5 小时前
Java网络编程学习笔记,从网络编程三要素到TCP/UDP协议
java·网络·学习
二哈喇子!5 小时前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
sin22015 小时前
MyBatis的执行流程
java·开发语言·mybatis
二哈喇子!5 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!5 小时前
基于Spring Boot框架的网络游戏虚拟交易平台的设计与实现
java·springboot·毕设项目
二哈喇子!5 小时前
JAVA环境变量配置步骤及测试(JDK的下载 & 安装 & 环境配置教程)
java·开发语言
二哈喇子!5 小时前
Java框架精品项目【用于个人学习】
java·spring boot·学习