我是编程的新手,我正在学习考试并且不了解一段代码的输出。我希望你能帮助我理解为什么最后打印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;
}
}
答案 0 :(得分:2)
ScopeTest myScope = new ScopeTest();
将myScope.z
初始化为 0 (默认值)myScope.doStuff();
将myScope.z
设置为 5 并调用doStuff2()
doStuff2()
将myScope.z
设置为 4 。最终结果是4.关键点是z
和main
方法中声明的本地doStuff()
变量对声明的z
成员变量没有任何影响在ScopeTest
。
答案 1 :(得分: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
的成员字段设置为值4
。然后将控制权返回doStuff()
。
System.out.println(z);
打印出局部变量z
的值。然后将控制权返回main()
。
System.out.println(z);
打印出局部变量z
的值。 (请记住,我们现在回到main()
。
System.out.println(myScope.z);
最后,打印成员字段 z
。 (请记住,它的值已在doStuff2()
中重新设置。此值会被记住,因为此z
是成员变量。)
答案 2 :(得分:1)
这是流程:
myScope.doStuff() - > 1. z = 5 2. doStuff2() - > Z = 4
答案 3 :(得分:0)
你在main()方法中调用dostuff(),你已经初始化了z = 5,它是它的局部变量z而不是类变量z。所以你要调用 dostuff2(),其中实际修改类变量z = 4 。这就是它在最后一个syestem.out.println(z)中打印z = 4的原因。希望这能帮助您理解输出。
答案 4 :(得分:0)
因为在第一行中声明的代码z
中是实例成员(this
context)。
所以当doStuff2()
被调用时,this.z
被设置为4。
//effectively
void doStuff2() {
this.z=4;
}
方法int z
和main
内声明的变量doStuff()
位于local context
。
在这里,只有最终设置z
上下文中的this
的值(在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