首页 > 编程语言 >【Java】包装类型变量的形参传递,方法内修改后,方法外还是原值?

【Java】包装类型变量的形参传递,方法内修改后,方法外还是原值?

时间:2024-08-04 14:24:49浏览次数:12  
标签:原值 Java 形参 void add num static Integer public

背景

前几天有个朋友写代码时,想把int变量作为形参传入方法中进行修改后,在方法外能够获取到修改后的变量进行下一步操作。类似这样:

class Test{

    public static void main(String[] args){
        int x=1;
        add(x);
        System.out.println(x);
    }

    public static void add(int num){
        num++;
    }

}

由于Java是值传递,所以这样是不行的。

(新手总是会有奇思妙想,知道可以用全局变量,但想用其他方法,随他的思路往下吧)

于是又想那使用包装类可以吗?比如这样:

class Test{

    public static void main(String[] args){
        Integer x=1;
        add(x);
        System.out.println(x);
    }

    public static void add(Integer num){
        num++;
    }

}

你猜怎么着,不行!

运行结果还是1

这是为什么呢?

原理

按照思路,x变量保存的地址已经传递给了num,那么num对这个对象内容进行修改之后,通过x是能看到的。

但是,包装类是有对象池的!

默认是-128到127之间的数,如果调用了包装类的valueOf方法就返回对象池的缓存对象

Integer x=1;是一个自动装箱的操作,其实是调用了Integer.valueOf方法将int类型的数据转换为Integer类型。

而num++这个动作可以被拆成num=num+1;

当包装对象和基本类型数据进行运算时,会进行拆箱,再执行运算,然后将运算的结果赋值给num,进行了自动装箱。从对象缓存池中取出了一个新的包装类型对象。

所以x的值没有发生改变!

最主要的原因就是进行运算后,发生了拆箱,装箱,导致num和x指向不同的对象

开发入门中,欢迎指教

标签:原值,Java,形参,void,add,num,static,Integer,public
From: https://blog.csdn.net/m0_73455589/article/details/140905488

相关文章

  • java学习进程五
    本周所做的内容这一周我主要集中在以下几个方面的学习:基本数据类型与运算符:我复习了Java的基本数据类型(如int、double、char、boolean)和运算符(如算术运算符、关系运算符、逻辑运算符)。控制流语句:我学习了Java的控制流语句,包括条件语句(if-else、switch-case)和循环语句(for......
  • 学Java的第五周(跳转语句和类与对象)
    循环在执行过程中,只有在循环条件不成立的情况下,才可以退出循环的执行。例如,沿着运动场跑5圈,可以将该过程视为一个循环,只有在跑完5圈之后才可以终止循环。但在实际情况中,由于个人的身体素质等问题,会出现未完成任务的情况,就需要终止循环。在程序执行过程中同样如此,有时需要根据需求......
  • 学Java的第四周
    for循环的执行结果如下:(1)先初始化变量i(inti=1)。(2)然后判断循环条件(i<=100)。(3)如果条件为true,则执行循环体进行累加求和(sum+=i),然后继续执行迭代部分,改变循环变量的值(i++),然后继续判断表达式2,这样就在判断、循环体与迭代部分之间形成循环,直至判断表达式2......
  • 暑假自学Java进度总结04
    一.今日所学:1.下载并使用idea开发工具1>了解idea的发展历史2>尝试用idea编写代码3>学习idea中的项目和模块操作2.学习赋值运算符加后赋值:“+=”减后赋值:“-=”乘后赋值:“*=“除后赋值:“/=”取余后赋值:“%=”3.学习关系运算符1>等于:“==”2>大于:“>”3>小于:“<”4>......
  • Java基础语法之控制流
    在上一篇文章中,我们介绍了Java基础语法之运算符和表达式(Java基础语法之运算符和表达式),在Java编程中,控制流结构决定了程序的执行顺序。通过使用不同的控制流语句,可以实现条件判断、循环执行和跳转操作。文章目录1.控制流结构类型条件语句循环语句跳转语句2.知识结构图......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-5-创建首个自动化脚本(详细教程)
     软件测试微信群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介前面几篇宏哥介绍了两种(java和maven)环境搭建和浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本。前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容,首先宏......
  • Java常用类和数据结构与算法
    1.其他常用类1.1.Math类java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值一般为double型。如果需要更加强大的数学运算能力,可以使用apachecommons下面的Math类库publicclassTestMath{publicstaticvoidmain(String[]args){S......
  • Java:Thread类
    Thread的常见构造方法Thread的常见属性ID是线程的唯一标识,不同线程不会重复名称是在使用各种调试工具时会用到的状态表示线程当前所处的情况优先级高的线程理论上来说更容易被调度到关于后台线程,需要记住:JVM会在一个进程的所有非后台线程结束后,才会结束运行是否存......
  • Java 文件 I/O流详解
    文件文件操作是Java开发中一个重要的组成部分,它允许开发者对文件进行读取,写入,创建,删除和修改等操作,文件操作的主要通过java.io包中的类来实现的,其中的File类更是文件操作的核心类File类的常用方法创建文件或目录文件创建使用createNewFile();可以创建一个新的空文......
  • JavaScript 中 arguments 对象与剩余参数的对比及转换
    引言在JavaScript中,处理函数调用时传递的不同数量的参数是一项常见的任务。为此,JavaScript提供了两种不同的方法:arguments对象和剩余参数(RestParameters)。本文将探讨这两种方法的区别,并介绍如何将arguments对象转换为真正的数组。arguments对象vs.剩余参数arguments......