变量的阴影/范围

时间:2016-01-31 13:46:51

标签: java dynamic static shadowing

我以为我理解了阴影的概念。但是这条守则让我想知道:

onclick="press()"

}

onclick="popUp()"

}

public class Counter {
int count = 0;

public void inc() {
    count++;
}

public int getCount() {
    return count;
}

所以基本上sc的静态类型是class StepCounter extends Counter { int count = 0; int step = 1; public StepCounter(int step) { this.step = step; } public void inc() { count += step; } 。 它的计数器递增两次,所以在前两个命令之后它是4。 我的计数变量不是私有的,它是包私有的(因为我没有声明任何可见性)。 因此,如果我在sc上调用StepCounter sc = new StepCounter(2); sc.inc(); sc.inc(); System.out.println(sc.getCount()); System.out.println(sc.count); 方法,它首先在StepCounter中查找它。没有,所以它去了Counter。在这里找到StepCounter方法。 该方法返回计数。如果count是静态的或私有的,我会理解为什么它返回0.但是为什么在这种情况下它会返回0?即使我在.getCount()中将变量计数公开,结果仍然是0。

3 个答案:

答案 0 :(得分:2)

getCount() 只能访问父类中定义的字段counter。此类在父类的 compile 时解析。孩子中的方法getCounter()没有副本

在子课程中,您可以使用

Counter.this.count

访问父计数器。但是为了避免不良的意外,你不应该以这种模棱两可的方式命名一个字段。

答案 1 :(得分:1)

在Java中,无法覆盖字段。只能覆盖方法。因此,在StepCounter中使用'count'变量不会覆盖超类'Counter'中的'count'字段。它只是创造了另一个领域。但是'getCount'方法返回超类中'count'字段的值。要获得所需的功能,需要覆盖StepCounter类中的'getCount'方法。

答案 2 :(得分:1)

你应该尽可能地避免阴影,它可能会为你的代码带来严重的不可预测的行为。 你在这里缺少的是Java中变量作用域的概念。 count仅仅是this.count的简写。因此,在调用getCounter()方法之后,根据您的代码,解析器在此处执行的操作是:

  1. 尝试将getCounter()解析为StepCounter
  2. 的实例
  3. 失败,试图找到任何班级祖先
  4. 最近的祖先是Counter,因此上下文切换为Counter class
  5. 尝试解析getCounter()
  6. 中的Counter
  7. 找到方法,尝试解析count
  8. 的值
  9. getCounter()是非静态的,因此count实际上是this.count(如果getCounter()是静态的,那么Counter.count
  10. this.count0 class
  11. 的实例范围内解析为值Counter
  12. 0已退回