我试图掌握ObjectOriented编程的想法,有人可以解释为什么局部变量(a)打印为零而不是放置在getter和setter中的set int。
这些是AppClass中的对象
Symptoms obj = new Symptoms();
test obj2 = new test();
actionPerformed ...我认为这就是你需要的所有AppClass
@Override
public void actionPerformed(ActionEvent e) {
int x = Integer.parseInt((field.getText()));
obj.setSleep(x);
writeSleep();
frame.setVisible(false);
obj2.tester();
readSleep();
initialize2();
}
这是症状类,我希望在我可以使用此功能时添加更多症状
public class Symptoms {
private int sleep;
public int getSleep() {
return sleep;
}
public void setSleep(int sleep) {
this.sleep = sleep;
}
}
这是测试者类,我希望打印出(a)
的值public class test {
public void tester(){
Symptoms get = new Symptoms();
int a;
a = get.getSleep();
System.out.println(a);
}
}
似乎测试类没有得到“消息”,但如果我在AppClass中运行相同的代码,给定我稍微修改一下代码,然后(a)将打印。
答案 0 :(得分:6)
因为JLS这样说,请参阅章节4.12.5. Initial Values of Variables:
每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10):
对于类型
int
,默认值为零,即0。
现在看到它令人困惑之后,我建议你将来明确地将它设置为零,它更清楚。
答案 1 :(得分:1)
在test.tester()
中,创建了Symptoms
的实例,并且永远不会调用方法setSleep()
,因此getSleep
会返回默认值a
,这是0。
您只需在setSleep
中致电obj.setSleep(x);
,其中obj
与get
完全不同。但由于x
不是static
,因此调用obj.setSleep
并不会更改get.x
的值 - 只会更改obj.x
的值。
答案 2 :(得分:0)
这是问题和答案的更好版本。它与将int设置为零无关。