Dou*_*ell 7 java inheritance shadowing
这可能是一件坏事,如在Java中的父级和子级类中讨论的具有相同的实例变量?.(如果父变量名称被更改怎么办?那么它将不再被遮蔽.)但是,我仍然好奇不同的静态/非静态变量是否会相互影响.一方面,我希望它们是相同的变量名称,因此将被遮蔽,但另一方面,似乎编译器可能基于静态区分这两者.
来自Java 语言规范:
如果表达式名称由单个Identifier组成,则必须有一个可见声明,表示该Identifier出现时范围内的局部变量、参数或字段 。否则,会发生编译时错误。
如果声明声明了最终字段,则名称的含义就是该字段的值。否则,表达式名称的含义就是声明所声明的变量。
如果超类中的方法引用该类的特定字段(静态或其他),则此时只有该类的该字段声明位于作用域内;子类的任何字段(静态或其他)都不在范围内。因此,该方法将始终使用超类字段,即使子类继承它并隐藏该字段。
这个答案是根据我对问题的新理解完全重写的。以下是我的第一个答案,为后代保留。
来自Java 语言规范:
名为n的字段、局部变量、方法参数、构造函数参数或异常处理程序参数的声明d会隐藏该点范围内名为n的任何其他字段、局部变量、方法参数、构造函数参数或异常处理程序参数的声明其中d出现在d的整个范围内。
这表明编译器需要隐藏父变量,无论静态性如何。
请注意,这些都与继承的方法无关,继承的方法始终使用原始变量,无论子类是否隐藏它们。我怀疑这不是你想问的。
| 归档时间: |
|
| 查看次数: |
8733 次 |
| 最近记录: |