方法参数的传递机制
int,string,Integer,arr[],类,传递参数的时候是怎样的一个方式的,期间变量会发生什么改变。让我们一起来研究研究。
还是通过代码的方式来了解。
public class Test1 {
public static void main(String[] args) {
int i = 1;
String str = "hello";
Integer num = 200;
int[] arr = { 1, 2, 3, 4, 5 };
MyData myData = new MyData();
change(i, str, num, arr, myData);
System.out.println("i="+i);
System.out.println("str="+str);
System.out.println("num="+num);
System.out.println("arr="+arr[0]);
System.out.println("myData="+myData.a);
}
public static void change(int j, String s, Integer n, int[] a, MyData m) {
j += 1;
s += "word";
n += 1;
a[0] += 1;
m.a += 1;
}
}
class MyData {
int a = 1;
}
可以先思考最后的结果是什么再看结果,更方便理解。
和你设想的结果是否符合呢?不符合是为什么,符合了你又是怎么理解的呢?让我们一起来看看。
以上便是各个数据存储的方式,
int 类型直接存储在栈中,
String 类型存储在常量池里,
数组、integer和类中的常量存储在堆中。
通过实参给形参赋值得到的结果,赋值时候并未发生太大变化。
其中形参是基本数据类型
- 传递数据值
实参是应用数据类型
- 传递地址值
- 特殊的类型:String、包装类等对象不可变性
这时候逐渐运行计算代码
首先是j += 1;
j的值等于J加上1,此时是栈内进行增加,
然后是s += "word";
在常量池当中进行l hello 和world的相加生成了一个新的常量helloworld同时也有一个与之前不同的地址值,此时的s被赋予一个新的地址值指向helloworld.
n += 1;
与s同理,只是其中的常量池变成了堆,堆中生成了一个新的值201,同时也被赋予一个新的地址值,n有了一个新的地址值指向201.
a[0] += 1;
中的地址值指向的是数组a[0]的值,进行了增加,并未生成新的值。
m.a += 1;
同样也是对堆中的int i=1进行了增加,但是并未改变原始的地址值。
具体可以看下图。
再看看最后的输出语句。
System.out.println("i="+i);
System.out.println("str="+str);
System.out.println("num="+num);
System.out.println("arr="+arr[0]);
System.out.println("myData="+myData.a);
最后的 i 结果依然是 1 ;
str的地址值也并未发生改变,所以str的输出依然是hello;
num与str同理并未发生变化;
arr[0]已经改变了当前数组地址的值,所以结果变为了2
myData.a的值也已经发生改变。
故最后的结果为
i=1
str=hello
num=200
arr=2
myData=2