为了便于理解方法参数传递,需要先介绍下Java中的变量的两种底层存储形式。Java中的变量分为基本类型和引用类型,基本类型变量保存数值本身,引用类型变量保存引用内存空间的地址。基本类型包括前面提到的byte、short、int、long、float、double、char和boolean;引用类型有类、String字符串、数组、接口和集合类等(后面章节会分别介绍各种引用类型)。
基本类型在定义变量时就分配了空间,这也是为什么定义一个基本类型的变量时必须初始化赋值的原因;而引用类型在定义时,只给变量定义了引用空间,而不分配数据空间,所以在定义引用类型时并不需要初始化赋值。
在创建方法时,可以设置参数,也可以不设置参数。对于设置参数的方法,当调用方法时需要向方法传递参数,被传入的参数成为实参,而方法定义时的参数为形参。方法间的参数传递共有两种方式:按值传递和按引用传递。
1.按值传递
按值传递会将实参的值赋值给对应的形参,在函数内部的操作针对形参进行,操作的结果不会影响到实参。因为方法接收到的是原始值的副本,此时内存中存在两个相等的基本类型。
动手写4.2.3
其运行结果为:
图4.2.3 按值传递程序运行结果
根据动手写4.2.3的运行结果可以看出,方法外部的实参number初始值为5,方法内部形参number虽然被赋予和实参相同的值5,但是形参number只是实参的一个副本。按值传递的特点是,被调用方法对形参的任何操作都是作为局部变量进行,不会影响主调方法的实参变量的值。因此计算后,方法内部的形参值number变成了13,而外部的实参值number依旧是5。
2.按引用传递
按引用传递就是将实参的内存地址传递给形参,方法中实参和形参都指向同一个内存地址,在方法内部所有对形参的操作都会影响到实参的值。
动手写4.2.4(www.xing528.com)
动手写4.2.4和动手写4.2.3类似,只是方法参数处入参变成了Person类定义对象,其最终的运行结果为:
图4.2.4 按引用传递程序运行结果
引用传递(pass-by-reference)过程中,形参和实参都指向同一个内存地址。方法内部形参经过计算后,值由最初的5变成了13,方法调用结束后,外部的实参值和方法内部形参保持一致,因此最终外部person对象中number值也是13。
这里需要特殊考虑String、Integer、Double、Float等基本类型的包装类,因为它们都是immutable类型,没有提供自身修改的函数,所以每次操作时都是新生成一个对象,可以理解为与基本类型相似,也是按值传递。
动手写4.2.5
动手写4.2.5与动手写4.2.3类似,只是将number的类型由基本类型int变为包装类型Integer,其运行结果如下:
图4.2.5 基本类型包装类为按值传递
提示
Java并不支持默认值传参的形式(这种情况在PHP等语言中很常见),因为Java中引入了方法重载的概念,默认值传参会造成相同方法名调用时发生歧义,所以Java不支持方法默认值传参。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。