Java 传参传值
Java 传参传值
案例代码
public class PassParamExplain { public static void main(String[] args) { //example A System.out.println("example A:"); Integer a = 2018; passInteger(a); System.out.println(a); a = passInteger(a); System.out.println(a); //example B System.out.println("example B:"); Pojo pojo1 = new Pojo(2021, "2021"); passPojo(pojo1); System.out.println("pojo1 x:" + pojo1.getX() + " y:" + pojo1.getY()); //example C System.out.println("example C:"); Pojo pojo2 = new Pojo(2022, "2022"); pojo2 = passPojo(pojo2); System.out.println("pojo2 x:" + pojo2.getX() + " y:" + pojo2.getY()); //example D System.out.println("example D:"); Pojo pojo3 = new Pojo(2023, "2024"); passPojoAndReassign(pojo3); System.out.println("a: pojo3 x:" + pojo3.getX() + " y:" + pojo3.getY()); pojo3 = passPojoAndReassign(pojo3); System.out.println("b: pojo3 x:" + pojo3.getX() + " y:" + pojo3.getY()); } public static Integer passInteger(Integer arg) { arg = 2019; return arg; } public static Pojo passPojo(Pojo pojoA) { pojoA.setX(2019); pojoA.setY("2019"); return pojoA; } public static Pojo passPojoAndReassign(Pojo pojoB) { pojoB = new Pojo(2020, "2020"); return pojoB; } }
public class Pojo { private Integer x; private String y; public Pojo(Integer x, String y) { this.x = x; this.y = y; } public Integer getX() { return x; } public void setX(Integer x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this.y = y; } }
案例分析
-
example A
- 调用passInteger(a)时,产生了一个新的局部变量arg,并且变量arg被赋值为a存放的引用,紧接着执行方法passInteger内的赋值语句 arg = 2019,此时局部变量arg被重新赋值为一个新的引用;
- 只执行passInteger(a)并不会修改main方法变量a的值(即变量a存放的引用),因为passInteger方法只对局部变量arg重新赋值并返回,调用passInteger(a)方法时仅仅是把变量a存放的引用传给了变量arg
- 执行 a = passInteger(a)时; 因为passInteger方法返回了一个新的引用(且每次调用都返回一个新引用,因为 arg = 2019 语句产生了新的对象), 并且赋值给了变量a,因此main方法变量a当然是改变了
-
example B
- 调用passPojo(pojo1)时,产生了一个新的局部变量pojoA,并且变量pojoA被赋值为参数pojo1的值(即pojo1存放的引用),此时变量pojoA的值为变量pojo1存放的引用(该引用指向pojo1对象的内存空间),两个变量存放的引用是相同的;
- 执行pojoA.setX(2019); pojoA.setY("2019"); 修改了该引用指向的内存空间的数据,因此即使仅仅调用passPojo(pojo1),变量pojo1指向的内存空间的数据也会相应得到改变
-
example C
- pojo2 = passPojo(pojo2);与passPojo(pojo2);的区别是前者接收了方法passPojo返回的引用,并赋值给了变量pojo2;但根据example B的分析可得,调用passPojo(pojo2)返回的引用其实和调用之前pojo2存放的引用是指向同一个空间的引用,
- 只是变量pojoA存放的是变量pojo2指向的内存空间引用的副本而已;
-
example D
- example D和example A本质其实是相同的,
- passPojoAndReassign(pojo3)时,产生了一个新的局部变量pojoB,并且变量pojoB被赋值为pojo3存放的引用,紧接着执行方法内语句pojoB = new Pojo(2020, "2020"); 此时局部变量pojoB被重新赋值为一个新的引用,该新引用指向new Pojo(2020, "2020")对象存放的内存空间;只修改了变量pojoB存放的引用,变量pojo3没有任何修改;
- 只执行passPojoAndReassign(pojo3),由于变量pojo3没有接收passPojoAndReassign方法的返回值所以并不会修改main方法变量pojo3存放的引用,而且passPojoAndReassign方法内也没有修改变量pojo3存放的引用指向的内存空间的数据,因此变量pojo3没有任何改变;
- pojo3 = passPojoAndReassign(pojo3);与passPojoAndReassign(pojo3)的唯一的不同点是前者用变量pojo3接收了passPojoAndReassign方法返回的新的引用,且每次调用passPojoAndReassign方法都返回一个新引用,因此main方法中变量pojo3存放的引用被改变了
案例数据变化打印输出
example A: 2018 2019 example B: pojo1 x:2019 y:2019 example C: pojo2 x:2019 y:2019 example D: a: pojo3 x:2023 y:2024 b: pojo3 x:2020 y:2020

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
基于 WebGL(ThingJS)的室内平面图 2D/3D 导航 DEMO(Part 1)
前言 利用CampusBuilder来搭建自己的虚拟世界过程有这样一个问题:如何快速聚焦到虚拟场景的某一位置。当然我们可以创建几个按钮对应查找我们需要去的位置(参照物)并聚焦,但是按钮并不是很炫酷也不能很好的反馈给我们一些信息。接下来我们就用平面导航图来解决这一问题。 实现 第一步,使用CampusBuilder搭建模拟场景,CampusBuilder操作简单,分分钟就可以上手。这里为每一个房间都创建一个小球作为视点参照物体并勾选预览时隐藏,这样不会对我们的场景造成影响,也便于我们聚焦到指定房间。注意:要将我们每个房间中的设备框选之后组合在一起,为下一阶段的做准备。 第二步,把我们编辑好的场景加载到ThingJS中。 //加载场景代码 var app = new THING.App({ // 场景地址 "url": "http:/
- 下一篇
这是一位拿到BAT大厂offer应届生的年终总结,那么你的呢?
壹 关于求职 2018年初,我还在北京后厂村的马路上被风吹得瑟瑟发抖。 那时我刚刚结束了半年的实习时光,开始考虑年后是否要继续实习。一开始我也在纠结实习转正和秋招之间如何权衡,但是在经历了春招以后,我还是老老实实地选择了夯实基础,备战秋招。 从四月份到七月份,我在三个月的时间内完成了大部分的秋招复习工作,当然了,读研两年期间里,我已经花了很多时间在自学Java后端技术上。 第一次面试的时间大概是在7月底参加提前批的时候,我在面过几家小公司之后,有了一定底气和经验,于是开始迎接BAT的提前批面试。 可能运气比较好,8月中旬就确定了阿里能给到offer,我自然信心大增,在充分准备以后,又参与了腾讯、百度和头条的面试,面完之后自我感觉还可以,等到了9月份也如期地收到了这三家公司的录用意向书。 当时身边同学找工作的氛围也很好,大家每天都在复习和面试,于是我也把这种状态延续到了10月份。 贰 关于公众号 值得一提的是,当时我习惯在每次面试完都在牛客网发表一篇面经,因为平时也经常在牛客网上看帖,自然也想分享一些东西,可能是由于我参加面试比较早,好几篇帖子都很火,一时间好像很多牛油都对我这个ID和头...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)