我以为我理解了阴影的概念。但是这条守则让我想知道:
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。
答案 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()
方法之后,根据您的代码,解析器在此处执行的操作是:
getCounter()
解析为StepCounter
类Counter
,因此上下文切换为Counter
class getCounter()
类Counter
count
getCounter()
是非静态的,因此count
实际上是this.count
(如果getCounter()
是静态的,那么Counter.count
)this.count
在0
class Counter
0
已退回