-1

我是编程的超级新手,我正在学习测试并且不理解一段代码的输出。我希望你能帮助我理解为什么最后会打印 4?

我将代码扔到 Java 可视化器站点中,我理解了所有内容,除了为什么行... System.out.println(myScope.z); 会打印数字 4 吗?

任何帮助是极大的赞赏!

public class ScopeTest {
   int z;

public static void main(String[] args){

  ScopeTest myScope = new ScopeTest();
  int z = 6;
  System.out.println(z);
  myScope.doStuff();
  System.out.println(z);
  System.out.println(myScope.z);
}

void doStuff() {
  int z = 5;
  doStuff2();
  System.out.println(z);
}

void doStuff2() {
  z=4;
}
}
4

5 回答 5

2
  1. ScopeTest myScope = new ScopeTest();初始化myScope.z0(默认值)
  2. myScope.doStuff();设置myScope.z5并调用doStuff2()
  3. doStuff2()设置myScope.z4

最终结果是 4。关键是和方法中z声明的局部变量与 中声明的成员变量没有任何关系。maindoStuff()zScopeTest

于 2014-10-09T04:48:32.893 回答
1

一次单步执行一行代码是一个很好的练习,可以弄清楚它在做什么。您应该使用纸和铅笔以及调试器来执行此操作。因此,让我们按照执行顺序一次一行地逐步执行您的代码。在每一行代码之后,我将解释它的作用。

ScopeTest myScope = new ScopeTest();

创建一个名为的局部引用变量并将myScope其初始化为一个对象。

int z = 6;

创建一个int名为的局部变量并将z其初始化为6.

System.out.println(z);

打印局部变量的值z

myScope.doStuff();

调用对象doStuff()myScope

int z = 5;

z在中创建一个局部变量doStuff()并将其初始化为5.

doStuff2();

称呼doStuff2()

z=4;

将名为的成员字段z设置为 value 4。然后将控制权返回给doStuff().

System.out.println(z);

打印出局部变量的值z。然后将控制权返回给main().

System.out.println(z);

打印出局部变量的值z。(记住我们现在回来了main()

System.out.println(myScope.z);

最后,打印出成员字段 z。(记住它的值是在 中设置的doStuff2()。这个值被记住是因为这z是一个成员变量。)

于 2014-10-09T04:53:21.817 回答
1

这是流程:

myScope.doStuff() --> 1. z=5 2. doStuff2() --> z=4

于 2014-10-09T04:54:35.790 回答
0

您在 main() 方法中调用 dostuff(),在那里您已初始化 z=5,这是它的局部变量 z 而不是类变量 z。因此,您正在调用dostuff2(),其中实际上是在修改类变量 z=4。这就是为什么它在最后一个 sysestem.out.println(z) 中打印 z=4。希望这将帮助您理解输出。

于 2014-10-09T04:50:37.197 回答
0

因为在 z第一行声明的代码中,是实例成员(this上下文)。

所以当everdoStuff2()被调用时this.z设置为4。

//effectively void doStuff2() { this.z=4; }

在方法内int z声明的变量位于.maindoStuff()local context

z在这里,只有在最终设置in thiscontext 的值(即 inside )时才重要doStuff2()。因此,

System.out.println(z); >> prints value of local variable z declared in main System.out.println(myScope.z); >> prints the value of instance (of ScopeTest which is myscope here) member z

于 2014-10-09T04:53:03.333 回答