4.7 栈图

将 4.6 节的代码片段组合起来可以得到完整的类定义,如下:

  1. public class PrintTime {
  2. public static void printTime(int hour, int minute) {
  3. System.out.print(hour);
  4. System.out.print(":");
  5. System.out.println(minute);
  6. }
  7. public static void main(String[] args) {
  8. int hour = 11;
  9. int minute = 59;
  10. printTime(hour, minute);
  11. }
  12. }

printTime 有两个形参——hourminutemain 有两个变量,也分别名为 hourminute。虽然名称相同,但这些变量是不同的变量:printTime 中的 hourmain 中的 hour 指向不同的存储位置,可以有不同的值。

例如,你可以像下面这样调用 printTime

  1. int hour = 11;
  2. int minute = 59;
  3. printTime(hour + 1, 0);

调用这个方法前,Java 会先计算实参的值,这里分别为 120,然后将这些值赋给形参。在 printTime 中,hour 的值为 12,而不是 11,而 minute 的值为 0,而不是 59。另外,即便 printTime 修改了其形参的值,但不会影响 main 中的变量。

要想对程序的方方面面进行跟踪,一种方法是绘制栈图(stack diagram)。栈图是一种显示方法调用的状态图(参见 2.3 节)。对于每一个方法,栈图中都有一个名为栈帧(frame)的方框,其中包含了这个方法的形参和变量。方法名位于栈帧的外面,而变量和形参则位于栈帧内。

与状态图一样,栈图也显示了变量和方法在特定时点的状态。图 4-1 是方法 printTime 刚执行时的栈图。

{%}

图 4-1:PrintTime 的栈图