2014-10-09 49 views
-1

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

我把代码扔在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; 
} 
} 

回答

1

步执行代码一次一个行是一个很好的锻炼弄清楚它在做什么。你应该用纸和铅笔以及调试器来做到这一点。所以让我们按照执行顺序逐行执行一行代码。在每行代码之后,我会解释它的功能。

ScopeTest myScope = new ScopeTest(); 

创建名为myScope本地参考变量并将其初始化到对象。

int z = 6; 

创建一个名为z本地int变量并初始化为6

System.out.println(z); 

打印本地变量的值z

myScope.doStuff(); 

拨打doStuff()myScope对象。

int z = 5; 

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

doStuff2(); 

呼叫doStuff2()

z=4; 

设置名为z为值4成员字段。然后将控制返回到doStuff()

System.out.println(z); 

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

System.out.println(z); 

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

System.out.println(myScope.z); 

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

+0

你们是真棒临屋!很多,你真的帮助过! – NoobCoderChick 2014-10-09 05:23:32

2
  1. ScopeTest myScope = new ScopeTest();初始化myScope.z到(缺省值)
  2. myScope.doStuff();myScope.z到并调用doStuff2()
  3. doStuff2()myScope.z到。

最终的结果是4,关键的一点是,在maindoStuff()方法声明的局部变量z任何有关于ScopeTest声明的z成员变量无关。

0

您正在main()方法中调用dostuff(),您已初始化z = 5,它是其局部变量z而不是类变量z。所以你打电话dostuff2()其中你是实际上修改类变量z = 4。这就是它在last syestem.out.println(z)中打印z = 4的原因。希望这会帮助你理解输出。

0

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

所以当过doStuff2()被称为this.z设置为4

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

变量int z方法main内声明和doStuff()local context

这里,只有当zthis上下文的值最后被设置(其在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

1

这是流量:

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