我想知道如果说一个字段在两个Java类之间是隐藏的,这意味着什么,以及在运行代码时会有什么结果?
我有一个抽象类,其中有一个protected static boolean field = false
字段和一个子类,
该子类具有相同名称但不是静态的布尔字段,并设置为true
。
如果我有以下代码:
Superclass d = new subclass();
在超类和子类中,布尔字段的值将是什么?在上述赋值后,子类字段是否保持为false
?
我想知道如果说一个字段在两个Java类之间是隐藏的,这意味着什么,以及在运行代码时会有什么结果?
我有一个抽象类,其中有一个protected static boolean field = false
字段和一个子类,
该子类具有相同名称但不是静态的布尔字段,并设置为true
。
如果我有以下代码:
Superclass d = new subclass();
在超类和子类中,布尔字段的值将是什么?在上述赋值后,子类字段是否保持为false
?
如果某个类声明了一个字段,那么该字段的声明会隐藏该类的超类和超接口中具有相同名称的所有可访问的字段声明。
如果该字段是
static
类型,则可以使用限定名称进行访问;如果是非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
}
}
static
成员永远不会被覆盖(当然也不会被非静态成员所覆盖)。因此,您应该像这样访问它们:ClassName.member
,也不需要担心隐藏它们。Superclass
字段:Superclass.field
。而一个Subclass
实例的字段就像这样:subclass.field
。但是,如果您在上面的Superclass
变量中有一个Subclass
实例,那么这段代码:d.field
将访问在Superclass
中定义的静态字段,在您的情况下将是false
。Subclass
实例的值,它只是访问“错误”的成员!您可以通过将实例放回到d
中的Subclass
变量中并再次读取field
来验证这一点。