【发布时间】:2016-01-31 13:46:51
【问题描述】:
我以为我理解了阴影的概念。但是这段代码让我想知道:
public class Counter {
int count = 0;
public void inc() {
count++;
}
public int getCount() {
return count;
}
}
class StepCounter extends Counter {
int count = 0;
int step = 1;
public StepCounter(int step) {
this.step = step;
}
public void inc() {
count += step;
}
}
StepCounter sc = new StepCounter(2);
sc.inc();
sc.inc();
System.out.println(sc.getCount());
System.out.println(sc.count);
所以基本上 sc 的静态类型是StepCounter。
它的计数器增加了两次,所以它在前两个命令之后是 4。
我的 count 变量不是私有变量,它是包私有的(因为我没有声明任何可见性)。
因此,如果我在 sc 上调用.getCount() 方法,它首先会在 StepCounter 中查找它。没有,所以它转到柜台。在这里它找到了getCount() 方法。
该方法返回计数。如果 count 是静态的或私有的,我会理解为什么它返回 0。但是为什么在这种情况下它会返回 0?即使我在StepCounter 中公开了变量计数,结果仍然是0。
【问题讨论】:
-
因为成员变量不是多态的。 Counter.getCount 总是返回 Counter.count。
-
这里的字段也没有阴影。它被隐藏了。
-
我仍然很难,在“相关”答案中很容易看到 b/c 方法是静态的。在我的情况下,它们不是。你是说成员变量(在类范围内创建的变量)总是静态的?
标签: java dynamic static shadowing