Java 变量的阴影/范围

Java 变量的阴影/范围,java,dynamic,static,shadowing,Java,Dynamic,Static,Shadowing,我想我理解了阴影的概念。但这段代码让我怀疑: public class Counter { int count = 0; public void inc() { count++; } public int getCount() { return count; } } } 因此,sc的静态类型基本上是步进计数器。 它的计数器增加了两次,所以在前两个命令之后是4。 我的count变量不是私有的,它是包私有的(因为我没有对它声明任何可见性)。 因此,如果我在sc上调用.getCo

我想我理解了阴影的概念。但这段代码让我怀疑:

public class Counter {
int count = 0;

public void inc() {
    count++;
}

public int getCount() {
    return count;
}
}

}

因此,sc的静态类型基本上是步进计数器。 它的计数器增加了两次,所以在前两个命令之后是4。 我的count变量不是私有的,它是包私有的(因为我没有对它声明任何可见性)。 因此,如果我在sc上调用
.getCount()
方法,它首先在StepCounter中查找它。没有,所以它去柜台。在这里找到
getCount()
方法。
该方法返回count。如果count是静态的或私有的,我就会理解为什么它返回0。但为什么在这种情况下返回0?即使我在
StepCounter
中公开了变量count,结果仍然是0。

在Java中,字段不能被覆盖。只能重写方法。因此,在StepCounter中有一个“count”变量不会覆盖超类“Counter”中的“count”字段。它只是创建了另一个字段。但是,“getCount”方法返回超类中“count”字段的值。要获得所需的功能,需要重写StepCounter类中的“getCount”方法。

在Java中,字段不能被重写。只能重写方法。因此,在StepCounter中有一个“count”变量不会覆盖超类“Counter”中的“count”字段。它只是创建了另一个字段。但是,“getCount”方法返回超类中“count”字段的值。要获得所需的功能,需要重写StepCounter类中的“getCount”方法。

您应该始终尽可能避免阴影,它可能会为代码引入严重的不可预测行为。 这里缺少的是Java中变量作用域的概念
count
只是
这个.count
的简写。因此,给定您的代码,在调用
getCounter()
方法之后,解析器在这里所做的是:

  • 尝试将
    getCounter()
    解析为
    StepCounter
    类的实例
  • 失败,请尝试查找任何类祖先
  • 最近的祖先是
    计数器
    ,因此上下文被切换到
    计数器
  • 尝试在
    Counter
    类中解析
    getCounter()
  • 方法,尝试解析
    count的值
  • getCounter()
    是非静态的,因此
    count
    实际上是
    这个.count
    (如果
    getCounter()
    是静态的,它将是
    Counter.count
  • this.count
    解析为
    Counter
    类实例范围内的值
    0
  • 返回
    0

  • 您应该始终尽可能避免阴影,它可能会为您的代码引入严重的不可预测行为。 这里缺少的是Java中变量作用域的概念
    count
    只是
    这个.count
    的简写。因此,给定您的代码,在调用
    getCounter()
    方法之后,解析器在这里所做的是:

  • 尝试将
    getCounter()
    解析为
    StepCounter
    类的实例
  • 失败,请尝试查找任何类祖先
  • 最近的祖先是
    计数器
    ,因此上下文被切换到
    计数器
  • 尝试在
    Counter
    类中解析
    getCounter()
  • 方法,尝试解析
    count的值
  • getCounter()
    是非静态的,因此
    count
    实际上是
    这个.count
    (如果
    getCounter()
    是静态的,它将是
    Counter.count
  • this.count
    解析为
    Counter
    类实例范围内的值
    0
  • 返回
    0
  • getCount()
    只能访问父类中定义的字段
    counter
    tht。该类在父类的编译时解析。子对象中没有方法
    getCounter()
    的副本

    在子类中,可以使用

    Counter.this.count
    
    访问父计数器。但是,为了避免不好的意外,您不应该以如此含糊的方式命名字段。

    getCount()
    只能访问父类中定义的字段
    计数器。该类在父类的编译时解析。子对象中没有方法
    getCounter()
    的副本

    在子类中,可以使用

    Counter.this.count
    

    访问父计数器。但为了避免不好的意外,您永远不应该以如此模糊的方式命名字段。

    因为成员变量不是多态的。Counter.getCount始终返回Counter.count.Related:这里的字段也没有阴影。它是隐藏的。我仍然有一个困难的时候,在“相关”的答案很容易看到b/c的方法是静态的。在我看来,它们不是。你是说成员变量(在类的作用域内创建的变量)总是静态的吗?因为成员变量不是多态的。Counter.getCount始终返回Counter.count.Related:这里的字段也没有阴影。它是隐藏的。我仍然有一个困难的时候,在“相关”的答案很容易看到b/c的方法是静态的。在我看来,它们不是。你是说成员变量(在类的作用域内创建的变量)总是静态的吗?我的对象有动态类型计数器。现在getCount()方法说“返回名为count的字段”。它不应该先查看自己的作用域(B)吗?@InDaPond字段永远不会被重写,因此当执行getCount方法时,它只会看到超级类中定义的“count”字段。我的对象具有动态类型计数器。现在getCount()方法说“返回名为count的字段”。它不应该先查看自己的作用域(B)吗?@InDaPond字段永远不会被重写,所以当执行getCount方法时,它会看到定义了“count”字段
    Counter.this.count