1.抛出问题
当我们将参数传递给函数时, 会发生一些奇妙的现象: 传入给函数的一些参数在函数内部的逻辑执行完毕之后被修改了, 而一些参数却不会被修改 !!?
2.先说结论
-
基本数据类型及其包装类型作为函数参数传递时, 传递的是拷贝值, 因此函数内部对拷贝值的操作处理并不会影响到外部传入的基本数据类型
就像钞票和印钞票的模子, 我把印好的钞票给你,你对钞票进行的的涂改,修剪并不会对我的钞票模子有任何影响
-
引用数据类型作为函数参数传递时, 传递的是对象的引用地址, 因此函数内部对对象的操作处理会影响到外部的引用类型
就像电视和遥控器, 我把遥控器给你, 你对电视进行换台,设置电视属性肯定会对我先前看着的电视剧有影响的
-
String 作为函数参数传递时, 传递的也是拷贝值(特例), 函数内部对 拷贝值的操作并不会影响到外部的String
3. 分析
java中的作为函数参数传递的类型主要有三类:
- 基本数据类型 + 包装类型
基本数据类型 | 范围 |
---|---|
byte | 八位, [-128,127] |
short | 16位, [-32768,32767] |
int | 32位, [-231,231-1] |
long | 64位,[-263,263-1] |
float | 32位,3.4e-45~1.4e38 |
double | 64位,4.9e-324~1.8e308 |
boolean | true or false |
char | 16位 |
- 引用数据类型: 数组, 类, 接口, 枚举
引用数据类型举例 | 类型 |
---|---|
int[] | 数组 |
Object | 终极父类 |
Student | 自定义对象 |
- String 类型
还有特殊看待的数据类型: Stirng 对象
4. 试验代码
public class MyTest {
public static void main(String[] args) {
int i1 = 1;
Integer i2 = 1;
int[] arr = {1};
String s = "NBA";
f(i1,i2,arr,s);
System.out.println( i1 ); // 1 未改变
System.out.println( i2 ); // 1 未改变
System.out.println( Arrays.toString(arr) ); // [789] 已改变
System.out.println( s ); // NBA 未改变
}
public static void f(int i1, Integer i2, int[] arr, String s) {
i1 = 123;
i2 = 456;
arr[0] =789;
s = "CBA";
}
}
5.总结
- 基本数据类型 / 包装类型 / String类型 ==> 值拷贝传递
- 引用数据类型 ==> 引用地址传递