为什么Java只有值传递?基本类型和对象类型传参区别详解

 更新时间:2026年07月15日 10:44:07   作者:Starry Sky001  
Java方法参数传递只有值传递,没有引用传递,本文通过代码示例和原理分析,详细解释了基本类型、包装类、自定义对象以及String在方法传参时的不同表现,帮你彻底理解参数传递机制,避免常见误区

前言

Java 中方法的传参没有所谓的值传递和引用传递,值传递和引用传递已经是历史,Java中只有值传递,参数传递的是参数的拷贝,这个拷贝在基本数据类型就是数值,对象类型就是引用!

1、基本类型

都是拷贝,当方法结束之后,变量销毁,不会影响传入变量的值

2、基本类型演变过来的

Integer,Double等等,虽然不是基本类型,但是也是拷贝(自动拆箱有关系),当方法结束之后,变量销毁,不会影响传入变量的值。

3、自定义的类

都是引用,也就是说,当方法结束之后,对象不会销毁,会影响传入变量的值

4、本人代码和执行结果

package com.books.tool.test;

public class Temp {
    public Integer a;
    public  Temp(Integer b){
        this.a=b;
    }
    //直接交换值
    public static void swap(Temp t1,Temp t2){
        Integer temp=t1.a;
        t1.a=t2.a;
        t2.a= temp;
    }
    public static void swapInteger(Integer t1,Integer t2){
        Integer temp=t1;
        t1=t2;
        t2= temp;
    }

    public static void main(String[] args) {
        Temp t1=new Temp(1);
        Temp t2=new Temp(2);
        System.out.println("交换之前t1的值"+t1.a);
        System.out.println("交换之前t2的值"+t2.a);
        swap(t1,t2);
        System.out.println("交换之后t1的值"+t1.a);
        System.out.println("交换之后t2的值"+t2.a);
        System.out.println("--------------------------");
        Integer i1=1;
        Integer i2=2;
        System.out.println("Integer交换之后i1的值"+i1);
        System.out.println("Integer交换之后i2的值"+i2);
        swapInteger(i1,i2);
        System.out.println("Integer交换之后i1的值"+i1);
        System.out.println("Integer交换之后i2的值"+i2);


    }

}

执行结果:

5、个人的看法与猜想

拷贝或者是引用可能和"="有关系

        Temp t1=new Temp(1);
        Temp t2=t1;     //属于引用,t1和t2都是指向同一个地址空间,t1改,t2的值也会变      
        Integer i1=250;
        Integer i2=i1;   //属于拷贝,i1改,指向不同的地址,i2不会变
        //这里有个隐藏条件Integer的值大于127或者小于-127

6、String和Integer实验效果一样,但是原理不一样

String当做参数传入方法后, 方法内更改值,不会影响外面参数的值,但是传入的时候,String并没有拷贝,也不算引用,而是指向了同一地址空间(字符串常量池)。

但是不同的是,普通对象指向同一地址空间,对象更改值,是更改地址空间的值。

而字符串更改值,是不改原来地址空间的值,而是如果字串符常量池有这个新值,那么就指向该地址,如果没有新值,就开辟一个地址空间存入新值,然后指向该地址。(有点抽象,但是你要慢慢理解)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • maven多profile 打包下 -P参和-D参数的实现

    maven多profile 打包下 -P参和-D参数的实现

    这篇文章主要介绍了maven多profile 打包下 -P参和-D参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 基于Springboot一个注解搞定数据字典的实践方案

    基于Springboot一个注解搞定数据字典的实践方案

    这篇文章主要介绍了基于Springboot一个注解搞定数据字典问题,大致的方向是自定义注解,在序列化的时候进行数据处理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Mybatis给数据库敏感字段加解密详解

    Mybatis给数据库敏感字段加解密详解

    这篇文章主要介绍了Mybatis给数据库敏感字段加解密详解,为了保护数据库敏感字段数据安全,有时候我们需要将敏感数据加密入库,查询时再解密成明文,我们可以利用Mybatis自定义TypeHandler来处理,需要的朋友可以参考下
    2023-11-11
  • SpringBoot 自定义注解实现涉密字段脱敏

    SpringBoot 自定义注解实现涉密字段脱敏

    关于数据脱敏,网上的文章都是硬编码规则,比如对身份证,手机号,邮件地址等固定写法脱敏。本文在此基础上,拓展动态从数据库查出涉密关键字执行脱敏操作。感兴趣的同学可以参考阅读
    2023-03-03
  • Spring interceptor拦截器配置及用法解析

    Spring interceptor拦截器配置及用法解析

    这篇文章主要介绍了Spring interceptor拦截器配置及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java实现猜数字小游戏

    Java实现猜数字小游戏

    大家好,本篇文章主要讲的是Java实现猜数字小游戏,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java8新特性之精简的JRE详解_动力节点Java学院整理

    Java8新特性之精简的JRE详解_动力节点Java学院整理

    这篇文章主要介绍了Java8新特性之精简的JRE详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • 使用MybatisPlus实现sql日志打印优化

    使用MybatisPlus实现sql日志打印优化

    本文主要介绍了使用MybatisPlus实现sql日志打印优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • java实现KFC点餐小程序

    java实现KFC点餐小程序

    这篇文章主要为大家详细介绍了java实现KFC点餐系统小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 关于Spring @Bean 相同加载顺序不同结果不同的问题记录

    关于Spring @Bean 相同加载顺序不同结果不同的问题记录

    本文主要探讨了在Spring 5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的Bean实例也会不同,文章通过分析ConfigurationClassPostProcessor的执行过程,解释了BeanDefinition的加载和覆盖机制,感兴趣的朋友一起看看吧
    2025-02-02

最新评论