值传递与引用传递
值传递 int n = 1; int n1 = n; n1 = 20; System.out.println("n = " + n + " n1=" + n1);
上面n和n1的输出结果分别为1,20。这就说明n1值的改变,不影响n的值
基本数据类型之间赋值,属于值传递(值拷贝)
下面从jvm层面分析下原理。使用 javap -v xxx.class 命令,获取字节码文件的汇编指令 public static void main(java.lang.String[]) throws java.io.IOException; descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=3, args_size=1 0: iconst_1 //将常量1压入栈中 1: istore_1 //常量1出栈,保存到局部变量表,槽点为1的位置 2: iload_1 //常量1入栈 3: istore_2 // 常量1出栈,保存到局部变量表, 槽点为2的位置 4: bipush 20 //将常量20压入栈中 6: istore_2 //常量20出栈,保存到局部变量表,槽点为2的位置 7: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 10: new #3 // class java/lang/StringBuilder 13: dup 14: invokespecial #4 // Method java/lang/StringBuilder."":()V 17: ldc #5 // String n = 19: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 22: iload_1 23: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 26: ldc #8 // String n1= 28: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 31: iload_2 32: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 35: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 38: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 41: return LineNumberTable: //行号表,代码的行号与指令索引的映射关系 line 58: 0 line 59: 2 line 60: 4 line 61: 7 line 79: 41 LocalVariableTable: //局部变量表 Start Length Slot Name Signature 0 42 0 args [Ljava/lang/String; 2 40 1 n I 4 38 2 n1 I
从字节码指令中,不难看出,变量n,n1分别存储在局部变量表的槽点1,2位置上。 执行 int n = 1 ,在LocalVariableTable中的槽点1的位置存放变量n,值为1 执行 int n1 = n ,在LocalVariableTable中的槽点2的位置存放变量n1,值为1 执行 n1 = 20 ,将20赋值给槽点2的变量n1,槽点1中的变量n的值不变。
以上得出,基本数据类型赋值,是值传递,后面再对任一变量修改,其实改的是不同地方,所以互不影响。 引用传递 int[] arr = {1,23,3}; int[] arr1 = arr; arr1[0] = 120;
问题:
上面代码执行完了,数组arr的第一个元素的值是否也变成了120?
下面咱们从字节码指令进行分析 public static void main(java.lang.String[]) throws java.io.IOException; descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=4, locals=3, args_size=1 0: iconst_3 // 常量3入栈 1: newarray int // new一个长度为3的数组 3: dup // 复制数组对象引用地址入栈 4: iconst_0 // 数组角标常量0入栈 5: iconst_1 // 常量1入栈 6: iastore // 出栈, 将栈顶int型数值1存入数组的索引0的位置 7: dup // 复制数组对象引用地址入栈 8: iconst_1 // 数组角标常量1入栈 9: bipush 23 // // 常量23入栈 11: iastore // 出栈, 将栈顶int型数值23存入数组的索引1的位置 12: dup // 复制数组对象引用地址入栈 13: iconst_2 // 数组角标常量2入栈 14: iconst_3 // 常量3入栈 15: iastore // 出栈, 将栈顶int型数值3存入数组的索引2的位置 16: astore_1 // 数组对象引用地址出栈,保存到局部变量表,槽点1的位置,变量名为arr 17: aload_1 // 槽点1中的变量arr引用地址入栈 18: astore_2 // 栈顶变量arr引用地址出栈,保存到局部变量表,槽点2的位置,变量名称为arr1 19: aload_2 // 槽点2中的变量arr1引用地址入栈 20: iconst_0· // 角标常量0入栈 21: bipush 120 //常量120入栈 23: iastore // 出栈, 将栈顶int型数值120存入数组的索引0的位置 24: return LineNumberTable: line 63: 0 line 64: 17 line 65: 19 line 77: 24 LocalVariableTable: Start Length Slot Name Signature 0 25 0 args [Ljava/lang/String; 17 8 1 arr [I 19 6 2 arr1 [I Exceptions: throws java.io.IOException MethodParameters: Name Flags args
从字节码指令中可以看出,数组arr,arr1都指向了同一个数组对象地址,当对数组某个角标的值进行改变,引用这个数组的所有变量的值都发生了改变。
关于调整享受车船税优惠的节能新能源汽车产品技术要求的公告近日,工信部财政部税务总局联合发布关于调整享受车船税优惠的节能新能源汽车产品技术要求的公告文件指出插电式混合动力(含增程式)乘用车纯电动续驶里程应满足有条件的等效全电里程不低于43
小米MIX5Pro渲染图曝光苹果汽车管理团队几乎全跑了?01hr小米MIX5Pro渲染图曝光据LetsGoDigital今日表示,小米最强高端旗舰可能不会命名为小米12Ultra,而是命名为小米MIX5Pro。平面设计师ParvezKh
很多车主一上车会关闭autohold,而选择手动控制,为什么?先来看看什么是autohold系统,如下图所示,一般在车内会有这样的一个按钮。autohold意为自动驻车,简单说来就是一种自动替你拉手刹的功能。有的车上显示AUTOH,有的车上则
网络贷款,一种另类的鸦片网络贷款就是一种鸦片互联网金融,网络贷款的盛行,到底带来了什么?稍微有流量的平台,都在做金融,这个社会到底是怎么了?联想,360,阿里巴巴,百度,小米,苏宁,京东,腾讯,美团。。等
遭遇网络暴力,受害人如何通过民事诉讼进行维权?网络维权,其实并不容易。第一个,被告身份信息。起诉要求有明确的被告,但我们根本没有网友的身份信息,起诉就存在问题。所以这里就有可能需要先起诉平台,让平台披露网友的身份信息。但有的网
福禄网络获最佳经营店铺等五项京东大奖段芳媛中国证券报中证网中证网讯(记者段芳媛)1月26日,国内知名数字商品及服务提供商福禄网络获得了由京东平台颁发的五个奖项,包括最佳经营店铺CPS最佳合作伙伴奖用户提升最佳合作伙伴
应届生小白做亚马逊运营助理难吗?先说结论!应届生做亚马逊运营助理不是一件很难的事情。根据题主的描述,题主已经过了英语四级,具备了一定的英语读写基础,只要接受相对系统的培训,是完全可以胜任亚马逊运营助理岗位的。跨境
人人都应该懂的电脑技巧对于经常用电脑办公的朋友来说,掌握一些常用的快捷键往往能够效率倍增,也许你身边还不乏这样的高手。今天小编就传授几招给大家,只需要花几分钟学一学,就能学到终生受用的技能。1快速切换程
冬天哪种取暖器最省电?小太阳油汀暖风机空调?还是其它?冬天,气温下降,寒风凛冽!冬天取暖成了人们不得不面对的问题。在室外,大家都裹上一层又一层的衣服。但是,在室内穿厚衣服就不方便了,随着科技的发展,市场上出现了很多取暖电器,如空调小太
海尔智家打造独具特色的科技创新之路1月17日,海尔集团创新年会上,5大委员会宣布成立。其中,科学与技术委员会瞄准建立科技自立自强的制度体系,是响应实体经济时代的破题之作。据了解,海尔集团在全球建立了10N开放创新体
南北年味尽收眼底vivoS12系列把摄影团队装进口袋年关已至,随处可见忙碌的身影,南北方年味主题却各异,你是否也像我一样,时常会好奇南北方年味到底都是怎样的?摄影师的镜头下的年味主题的影像样张或许可以帮我们一探究竟。近日,有摄影师使
爱普生推出世界上最小最轻的20000流明投影机爱普生推出了一系列专业的可更换镜头激光投影仪,旨在照亮音乐厅博物馆和体育场等大型场所,包括世界上最小和最轻的20000流明投影仪。随着20000流明市场的持续增长,爱普生的新型EB
兄弟打印机清零大全看看有你需要的吗?一兄弟4040CN4050彩打硒鼓清零方法兄弟4040CN彩色激光打印机更换硒鼓后清零方法如下当打印机出现DrumEndSoon等字母提示时,就提醒您要更换硒鼓了。当您更换新的硒鼓
想要将图片上的文字转换出来,用什么软件比较好?写作的时候,如果遇到了一些素材是图片的形式,需要人工把图片转文字,是很浪费时间的一件事情。现在有了图片文字识别技术,一切都变得简单多了,具体有哪些好用的文字识别软件,我们一起来看看
跨越广义功能安全壁垒随着人工智能大数据物联网技术发展,人机物三元融合的时代已经开启。基于人机物融合的新一代数字基础设施建设,推动了数字经济与智慧社会新发展,促使各种资源集约化管理智能化服务泛在化,新经
8点1氪丨腾讯回应应届生怼管理层被标记永不录用喜茶回应裁员iPhone推出点击支付功能上市进行时证监会同意3家公司创业板IPO注册证监会2月9日公告,同意广州市聚赛龙工程塑料股份有限公司常州祥明智能动力股份有限公司广东瑞德智能科技股份有限公司首次公开发行股票并在创业
你使用的是数据结构还是对象?你编写的是数据结构还是对象写Java的人都会自豪的说我是面向对象编程(或许没有那么自豪)。但我们在实际大型网络项目中进行开发的时候,我们最经常编写的各种对象,他们设计的是否真的妥当
英国专家发现荷兰高传染性艾滋病毒变种英国研究人员发现,一种HIV变种已经在荷兰流行了几十年,这种变种比HIV病毒的其他变种更具传染性,也可以更快地使人患上艾滋病。牛津大学的研究人员在科学杂志Science上报告说,在
医院的电脑维护工作难吗?作为一个医院的网工,我可以肯定的回答你,难!为什么难?不是难在专业知识方面,而是,杂事太多了。说说我自己吧,三甲专科医院,主要负责硬件方面的维护,日常工作分三大类1,桌面运维,主要
第二代英语分级视频V6。0安装方法绝大多数安卓手机可以运行,建议安装到智能电视或智能机顶盒上观看学习。安卓手机平板打开浏览器,输入下载地址httpswww。lanzoui。comi74o5bg即可下载分级娃英语分级
工程师思维和科学家思维有什么区别?工程师的思维,是应用以掌握的知识,和成熟技术,来开发应用技术,说白点,就是用科学家的理论,和他们的研发成果的种子技术,在来开发新产品。他们只需要了解技术的性能和参数就行了,也就不需
量子模拟重大突破中国科学家首次测得第二声衰减率来源科技日报量子模拟重大突破我科学家首次测得第二声衰减率本报记者吴长锋记者2月7日从中国科学技术大学了解到,中国科大在量子模拟领域获重大突破潘建伟姚星灿陈宇翱团队基于超冷锂镝原子量