dav*_*veb 4 java field instance-variables static-variables member-hiding
我想知道在两个java类之间隐藏字段是什么意思,以及在结果输出方面运行代码时它意味着什么?
我有一个带有a protected static boolean field = false和子类的抽象类,它有一个具有相同名称但不是静态的布尔字段并设置为true.
如果我有这个代码:
Superclass d = new subclass();
Run Code Online (Sandbox Code Playgroud)
超类中的布尔字段和子类中的布尔字段的值是多少?子类字段是否保留为false上面的赋值后?
非常感谢
Pau*_*gas 10
如果类声明了具有特定名称的字段,那么该字段的声明将被称为隐藏超类中具有相同名称的字段的任何和所有可访问声明,以及该类的超接口.
如果是
static,则可以使用限定名称访问隐藏字段,或者使用包含关键字的字段访问表达式super或超类型类型转换来访问隐藏字段.
有关详细信息,请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html
class A {
static int field;
}
class B extends A {
int field;
void doSomething() {
System.out.println(super.field); // From A
System.out.println(field); // From B
}
}
class Main {
public static void main(String[] args) {
B b = new B();
System.out.println(b.field); // From B
System.out.println(((A) b).field); // From A
System.out.println(A.field); // From A
}
}
Run Code Online (Sandbox Code Playgroud)static成员永远不会被覆盖(当然也不是非静态成员).因为您应该像这样访问它们:ClassName.member也没有必要担心隐藏它们.
在您的情况下,您将访问如下Superclass字段:Superclass.field.Subclass像这样的实例领域:subclass.field.如果你有Subclass一个Superclass像上面这样的变量中的实例,那么这段代码:d.field将访问定义的静态字段Superclass,这将是false你的情况.
但这并没有改变Subclass实例的价值,它只是访问"错误的"成员!您可以通过将实例d放回Subclass变量并field再次读取来验证这一点.