---------------------- <a target="blank">ASP.Net+Android+IO开发S</a>、<a target="blank">.Net培训</a>、期待与您交流! ----------------------
学习了一下参数传递的知识,并且看到一个关于参数传递的小程序,对理解参赛传递很有帮助,特来与大家分享下。
如果方法A调用方法B,那么,称方法A是方法B的调用者,如果B的方法参数是基本类型参数,那么方法A向方法B传递参数的值,如果方法B的参数是对象或数组,那么方法A向方法B传递对象或数组的引用。下面这个例子中ParamTester类中,main()方法调用changeParameter()方法,changeParameter()方法有四个参数,param1是基本数据类型,param2和param3是ParamTester引用类型,param4是数组类型,与changeParameter()方法的四个参数对应,在main()方法中定义了param1,param2,param3和param4这四个局部变量。- public class ParamTester
- {
- public int memberVariable=0;
- public static void main(String[] args)
- {
- //声明并初始化四个局部变量
- int param1 = 0;
- ParamTester param2 = new ParamTester();
- ParamTester param3 = new ParamTester();
- int [ ] param4 = {0};
- changeParameter(param1,param2,param3,param4);
-
- //打印四个局部变量
- System.out.println("param1="+param1);
- System.out.println("param2.memberVariable="+param2.memberVariable);
- System.out.println("param3.memberVariable="+param3.memberVariable);
- System.out.println("param4="+param4[0]);
- }
- public static void changeParameter(int param,ParamTester param2,ParamTester param3,int[ ] param4)
- {
- param1=1;
- param2.memberVariable=1;
- param3 = new ParamTester();
- param3.memberVariable=1
- param4[0]=1;
- }
- }
- <p> </p>
复制代码 当用java启动一个java虚拟机时,java虚拟机会创建一个主线程,该线程从程序入口main()方法开始执行,主线程在java栈区内有一个方法调用栈,执行一个方法,就会向方法调用栈中压入一个包含该方法的局部变量及参数的栈帧。
主线程首先把main()方法的栈帧压入方法调用栈,在这个栈帧中包含四个局部变量,当主线程执行changeParameter()方法时,会把该方法的栈帧也压入方法调用栈,在这个栈中包含四个param参数,它们的初始值由main()方法的四个局部变量传递,下图显示了主线程开始执行changeParameter()方法时调用栈的状态。
从中可以看出,main()方法把param1局部变量的值传递给changeParameter()方法的param1参数,main()方法把param2,param3,param4局部变量的引用分别传递给changeParameter()方法的param2,param3,param4。
接下来,主线程执行changeParameter()方法的代码,先把param1修改为1,再把param2参数引用的ParamTester对象的memberVariable实例变量的值修改为1,param3引用一个新的对象,并把这个ParamTester对象的memberVariable实例变量的值修改为1;最后把param4的参数所引用的数组对象的第一个元素的值改为1.当主线程执行完changeParameter()方法时,方法调用栈状态如下;
从中可以看出,main()方法把param1局部变量的值传递给changeParameter()方法的param1参数,main()方法把param2,param3,param4局部变量的引用分别传递给changeParameter()方法的param2,param3,param4。
接下来,主线程执行changeParameter()方法的代码,先把param1修改为1,再把param2参数引用的ParamTester对象的memberVariable实例变量的值修改为1,param3引用一个新的对象,并把这个ParamTester对象的memberVariable实例变量的值修改为1;最后把param4的参数所引用的数组对象的第一个元素的值改为1.当主线程执行完changeParameter()方法时,方法调用栈状态如下; 从图可以看出main()方法的param3局部变量与changeParameter()方法的param3的参数不再引用同一个对象。
主线程执行changeParameter()方法完毕,退回到main()方法前,会把方法调用栈中changeParameter()方法弹出,该栈中包含的四个参赛结束生命周期,主线程继续执行main()方法,最后打印结果如下:
parameter=0
param2.memberVariable=1
param3.memberVariable=0
param4=1
|