为什么(a)打印(0)?

时间:2015-10-15 20:05:36

标签: java

我试图掌握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)将打印。

3 个答案:

答案 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);,其中objget完全不同。但由于x不是static,因此调用obj.setSleep并不会更改get.x的值 - 只会更改obj.x的值。

答案 2 :(得分:0)

这是问题和答案的更好版本。它与将int设置为零无关。

How to set and get with three Classes?