一文让你彻底明白Java中的值传递和引用传递

 更新时间:2023年10月11日 09:03:34   作者:我是小章哥  
这篇文章主要给大家介绍了关于Java中值传递和引用传递的相关资料,值传递是指在调用函数时将实际参数复制一份传递到函数中,引用传递是指在调用函数时将实际参数的引用直接传递到函数中,需要的朋友可以参考下

基本概念

值传递:

传递对象的一个副本,即使副本被改变,也不会影响源对象,因为值传递的时候,实际上是将实参的值复制一份给形参。

引用传递:

传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。
说明:对象传递(数组、类、接口)是引用传递,原始类型数据(整形、浮点型、字符型、布尔型)传递是值传递。

例子:

1、值传递:

public class Demo {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        work(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    public static void work(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
?
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

运行结果:

a = 20
b = 10
num1 = 10
num2 = 20

虽然在work()方法中a,b的值做了交换,但是主方法中num1,num2的值并未改变。

2、引用类型传递

public class ArrayListDemo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        change(arr);
        System.out.println(arr[0]);
    }
    public static void change(int[] array) {
        System.out.println(array[0]);
        array[0] = 0;
    }
}

运行结果:

1
0

在change()方法中将数组的第一个元素改为0,主方法中数组的第一个元素也跟着变为0。

3、StringBuffer类型

public class Demo {
?
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer("北京异乡人");
        System.out.println(stringBuffer);
?
        changeStringBuffer(stringBuffer);
        System.out.println(stringBuffer);
    }
?
    public static void changeStringBuffer(StringBuffer stringBuffer) {
        stringBuffer = new StringBuffer("河北异乡人");
        stringBuffer.append(",哈哈哈");
    }
}

运行结果:

北京异乡人
北京异乡人

也许你会认为第2次应该输出“河北异乡人,哈哈哈”,怎么输出的还是原来的值呢,那是因为在changeStringBuffer中,又new了一个StringBuffer对象,此时stringBuffer变量指向的内存地址已经改变,所以主方法中的stringBuffer变量未受到影响。
如果修改changeStringBuffer()方法的代码为:

public static void changeStringBuffer(StringBuffer stringBuffer) {
    stringBuffer.append(",欢迎大家关注");
}

则运行结果会变为:

北京异乡人
北京异乡人,欢迎大家关注

4、String类型

public class Demo {
    public static void main(String[] args) {
        String str = new String("北京异乡人");
        System.out.println(str);
        changeString(str);
        System.out.println(str);
    }
?
    public static void changeString(String string) {
        string = new String("河北异乡人");
    }
}

运行结果:

北京异乡人
北京异乡人

在changeString()方法中不管用string = “河北异乡人”;还是string = new String(“河北异乡人”);,
主方法中的str变量都不会受影响,也验证了String创建之后是不可变更的。

5、自定义类型

public class Person {
    private String name;
    public String getName() {
        return name;
    }
?
    public void setName(String name) {
        this.name = name;
    }
?
    public Person(String name) {
        this.name = name;
    }
}
?
public class ArrayListDemo {
?
    public static void main(String[] args) {
        Person person = new Person("李四");
        System.out.println(person.getName());
?
        changePerson(person);
        System.out.println(person.getName());
    }
?
    public static void changePerson(Person p) {
        Person person = new Person("张三");
        p = person;
    }
}

运行结果:

李四
李四

修改changePerson()方法代码为:

public static void changePerson(Person p) {
    p.setName("张三");
}

运行结果:

李四
张三

总结

到此这篇关于Java中值传递和引用传递的文章就介绍到这了,更多相关Java值传递和引用传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA面试题之缓存击穿、缓存穿透、缓存雪崩的三者区别

    JAVA面试题之缓存击穿、缓存穿透、缓存雪崩的三者区别

    当服务器QPS比较高,并且对数据的实时性要求不高时,往往会接入缓存以达到快速Response、降低数据库压力的作用,常用来做缓存的中间件如Redis等。本文主要介绍了JAVA面试时常考的缓存击穿、穿透、雪崩场景三者区别,有兴趣的小伙伴可以看一下
    2021-11-11
  • Java实现一个顺序表的完整代码

    Java实现一个顺序表的完整代码

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储。在数组上完成数据的增删减改。顺序表的底层是一个数组
    2021-04-04
  • RestTemplate文件上传下载与大文件流式下载

    RestTemplate文件上传下载与大文件流式下载

    这篇文章主要为大家介绍了RestTemplate文件上传下载与大文件流式下载的使用方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-03-03
  • SpringKafka消息发布之KafkaTemplate与事务支持功能

    SpringKafka消息发布之KafkaTemplate与事务支持功能

    通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支持特性尤为重要,它确保了在分布式环境中的数据一致性,感兴趣的朋友一起看看吧
    2025-04-04
  • 解决RedisTemplate存储至缓存数据出现乱码的情况

    解决RedisTemplate存储至缓存数据出现乱码的情况

    这篇文章主要介绍了解决RedisTemplate存储至缓存数据出现乱码的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • SpringBoot实现自定义启动器的示例详解

    SpringBoot实现自定义启动器的示例详解

    虽然Spring官方给我们提供了很多的启动器供我们使用,但有时候我们也会遇到某些特殊场景,这些启动器满足不了。这个时候就需要自定义一个启动器供我们使用,本文为大家介绍了SpringBoot实现自定义启动器的方法,希望对大家有所帮助
    2023-01-01
  • Java基于二叉查找树实现排序功能示例

    Java基于二叉查找树实现排序功能示例

    这篇文章主要介绍了Java基于二叉查找树实现排序功能,结合实例形式分析了Java二叉查找树的定义、遍历及排序等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Spring Boot系列教程之死信队列详解

    Spring Boot系列教程之死信队列详解

    这篇文章主要给大家介绍了关于Spring Boot系列教程之死信队列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Java spring单点登录系统

    Java spring单点登录系统

    这篇文章主要介绍了Java spring单点登录系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 基于SpringBoot接口+Redis解决用户重复提交问题

    基于SpringBoot接口+Redis解决用户重复提交问题

    当网络延迟的情况下用户多次点击submit按钮导致表单重复提交,用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交也会出现用户重复提交,办法有很多,我这里只说一种,利用Redis的set方法搞定,需要的朋友可以参考下
    2023-10-10

最新评论