天真,居然还有人认为java的参数传递方式是引用传递

代码写的越急,程序跑得越慢 。—— Roy Carlson
时间过得真快,2020已经过去了一半,但是疫情好像还没有真正的消灭,人们出行还是得带着口罩,天气越来越热,受罪啊 。
言归正传,都2020年了,居然还有人认为JAVA的参数传递方式是引用传递,今天我就来讲一讲java的参数传递,好好看,写的不对的地方,请大声说出来,反正我也不会改,憋坏了就不好了 。
基本数据类型传递我们先来看一个普通的例子
package com.ymy.param;/** * @ProjectName: demo * @Package: com.ymy.param * @ClassName: BaseTypeTest * @Author: 流星007 * @Description: 基本数据类型传递 * csdn:https://blog.csdn.net/qq_33220089 * 今日头条:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523 * @Date: 2020/7/5 12:52 * @Version: 1.0 */public class BaseTypeTest {public static void main(String[] args) {int a = 1;dosomthing(a);System.out.println("主函数a的值 = "+a);}private static void dosomthing(int a) {a = a-1;System.out.println("修改过后,a = "+a);}}1234567891011121314151617181920212223242526272829这是一个很简单的一个方法,在主函数main中对变量进行了初始化a=1,然后将a传递给dosomthing(),然后再dosomthing中输出了修改之后的值,最后在主函数中打印a的值,你们觉得这几句输出中a的值分别是多少呢?
第一种:修改过后,a = 0主函数a的值 = 1第二种:修改过后,a = 0主函数a的值 = 0第三种:修改过后,a = 1主函数a的值 = 1
想要得到答案的话就得先明白参数传递的两个类型:值传递和引用传递 。
什么是引用传递?在C++中,函数参数的传递方式有引用传递 。所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数 。
什么是值传递?值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 。
我们再回过头来看上面的例子,如果是引用传递的话打印结果应该是第二种情况,如果是值传递,打印结果应该是第一种情况,所以到底打印的结果是什么呢?
我们一起看一看控制台输出
Connected to the target VM, address: '127.0.0.1:59333', transport: 'socket'修改过后,a = 0主函数a的值 = 1Disconnected from the target VM, address: '127.0.0.1:59333', transport: 'socket'Process finished with exit code 0123456这就是第一种情况,很明显,在dosomthing函数中修改了a的值,但是主函数中的a并没有受到影响,所以肯定不会是引用传递,如果是引用传递,主函数的a应该会变成0,只有在参数传递的时候将主函数的中参数复制一份给dosomthing,才能在dosomthing中修改a不会对主函数造成影响,所以从基本数据类型来看,java的参数传递方式为:值传递 。
这个时候你可能会有疑问了,这只是基本数据类型的传递方式,其他的参数类型呢?下面我们一起来看看引用类型和对象类型的传递方式 。
follow me !!!!!
引用类型传递我们都知道java中的String类型不属于基本数据类型,它是一个引用类型,也可以说是一个对象,那么它的传递方式是什么呢?
我们还是先来看例子
package com.ymy.param;/** * @ProjectName: demo * @Package: com.ymy.param * @ClassName: StringTypeTest * @Author: 流星007 * @Description: String类型传递 * csdn:https://blog.csdn.net/qq_33220089 * 今日头条:https://www.toutiao.com/c/user/5372182357/#mid=1637641735275523 * @Date: 2020/7/5 14:22 * @Version: 1.0 */public class StringTypeTest {public static void main(String[] args) {String a = "hello";dosomthing(a);System.out.println("主函数a的值 = "+a);}private static void dosomthing(String a) {a = a+" bug";System.out.println("修改过后,a = "+a);}}123456789101112131415161718192021222324252627282930打印结果
修改过后,a = hello bug主函数a的值 = helloProcess finished with exit code 01234我们发现主函数的a并没有受到dosomthing函数的影响,所以这并不是引用传递,这个时候你说是因为a = a+" bug";这行代码生成了新的对象,所以才会导致数据不一致,我们先来看看a的赋值情况吧
// class version 52.0 (52)// access flags 0x21public class com/ymy/param/StringTypeTest {// compiled from: StringTypeTest.java// access flags 0x1public <init>()VL0LINENUMBER 14 L0ALOAD 0INVOKESPECIAL java/lang/Object.<init> ()VRETURNL1LOCALVARIABLE this Lcom/ymy/param/StringTypeTest; L0 L1 0MAXSTACK = 1MAXLOCALS = 1// access flags 0x9public static main([Ljava/lang/String;)V// parameterargsL0LINENUMBER 17 L0LDC "hello"ASTORE 1L1LINENUMBER 18 L1ALOAD 1INVOKESTATIC com/ymy/param/StringTypeTest.dosomthing (Ljava/lang/String;)VL2LINENUMBER 19 L2GETSTATIC java/lang/System.out : Ljava/io/PrintStream;NEW java/lang/StringBuilderDUPINVOKESPECIAL java/lang/StringBuilder.<init> ()VLDC "\u4e3b\u51fd\u6570a\u7684\u503c = "INVOKEVIRTUAL java/lang/StringBuilder.Append (Ljava/lang/String;)Ljava/lang/StringBuilder;ALOAD 1INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)VL3LINENUMBER 21 L3RETURNL4LOCALVARIABLE args [Ljava/lang/String; L0 L4 0LOCALVARIABLE a Ljava/lang/String; L1 L4 1MAXSTACK = 3MAXLOCALS = 2// access flags 0xAprivate static dosomthing(Ljava/lang/String;)V// parameteraL0LINENUMBER 24 L0NEW java/lang/StringBuilderDUPINVOKESPECIAL java/lang/StringBuilder.<init> ()VALOAD 0INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;LDC " bug"INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;ASTORE 0L1LINENUMBER 25 L1GETSTATIC java/lang/System.out : Ljava/io/PrintStream;NEW java/lang/StringBuilderDUPINVOKESPECIAL java/lang/StringBuilder.<init> ()VLDC "\u4fee\u6539\u8fc7\u540e\uff0ca = "INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;ALOAD 0INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)VL2LINENUMBER 27 L2RETURNL3LOCALVARIABLE a Ljava/lang/String; L0 L3 0MAXSTACK = 3MAXLOCALS = 1}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485


推荐阅读