A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 学习者 初级黑马   /  2013-9-24 23:53  /  980 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

---------------------- <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这四个局部变量。
  1. public class ParamTester
  2. {
  3.     public int memberVariable=0;
  4.     public static void main(String[] args)
  5.     {
  6.         //声明并初始化四个局部变量
  7.         int param1 = 0;
  8.         ParamTester param2 = new ParamTester();
  9.          ParamTester param3 = new ParamTester();
  10.         int [ ] param4 = {0};
  11.         changeParameter(param1,param2,param3,param4);
  12.         
  13.         //打印四个局部变量
  14.         System.out.println("param1="+param1);
  15.         System.out.println("param2.memberVariable="+param2.memberVariable);
  16.         System.out.println("param3.memberVariable="+param3.memberVariable);
  17.         System.out.println("param4="+param4[0]);
  18.     }

  19.     public static void changeParameter(int param,ParamTester param2,ParamTester param3,int[ ] param4)
  20.     {
  21.         param1=1;
  22.         param2.memberVariable=1;
  23.         param3 = new ParamTester();
  24.         param3.memberVariable=1
  25.         param4[0]=1;
  26.     }
  27. }
  28. <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



psb2.jpg (43.8 KB, 下载次数: 0)

psb2.jpg

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马