java - 阴影/变量范围

标签 java dynamic static shadowing

我以为我理解阴影的概念。但是这段代码让我想知道:

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 变量不是私有(private)的,它是包私有(private)的(因为我没有声明它的任何可见性)。 因此,如果我在 sc 上调用 .getCount() 方法,它首先会在 StepCounter 中查找它。没有,所以它去柜台。它在这里找到了 getCount() 方法。 该方法返回计数。如果 count 是静态的或私有(private)的,我会理解为什么它返回 0。但是为什么在这种情况下它返回 0?即使我在 StepCounter 中公开变量计数,结果仍为 0。

最佳答案

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

在子类中,可以使用

Counter.this.count

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

关于java - 阴影/变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35114527/

相关文章:

java - org.w3c.dom.NodeList 不扩展 Iterable

java - 将数据从http服务器端推送到浏览器客户端的最佳方式

c++ - 头文件中定义的 const static 变量在不同的翻译单元中具有相同的地址

java - JerseyTest 和 JUnit 抛出 NullPointerException

c++ - C++中的动态类创建

c++ - 如何捕获从 GCC C++ 中的库抛出的异常?

javascript - 通过 prop 自定义组件中的动态文本

image - 检测谷歌地图街景静态图片的 "we have no imagery"

android - 当 Android Dialog 被解除时,你能触发一个事件吗?

java - 在用户在java中输入正确的输入之前,如何获取用户的输入?