我想知道说一个字段隐藏在 2 个 java 类之间是什么意思,以及在运行代码时根据结果输出意味着什么?
我有一个带有 aprotected static boolean field = false
和一个子类的抽象类,该类具有一个具有相同名称但不是静态的布尔字段并设置为true
.
如果我有这个代码:
Superclass d = new subclass();
超类中的布尔字段和子类中的布尔字段的值是多少?子类字段false
在上面的分配之后是否保持不变?
我想知道说一个字段隐藏在 2 个 java 类之间是什么意思,以及在运行代码时根据结果输出意味着什么?
我有一个带有 aprotected static boolean field = false
和一个子类的抽象类,该类具有一个具有相同名称但不是静态的布尔字段并设置为true
.
如果我有这个代码:
Superclass d = new subclass();
超类中的布尔字段和子类中的布尔字段的值是多少?子类字段false
在上面的分配之后是否保持不变?
如果该类声明了一个具有特定名称的字段,则该字段的声明被称为隐藏了超类和该类的超接口中具有相同名称的任何和所有可访问的字段声明。
如果隐藏字段是 ,则可以通过使用限定名称
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
. 但是,如果您在上面的变量中有一个Subclass
实例,则此代码:将访问中定义的静态字段,这将是您的情况。Superclass
d.field
Superclass
false
但这不会改变Subclass
实例的值,它只是访问了“错误”的成员!您可以通过将实例d
放回变量并再次Subclass
读取来验证这一点。field
超类中的布尔字段和子类中的布尔字段的值是多少?
超类中变量的值field
将保持为假,field
子类中的值将保持为真。
在上述分配之后,子类字段是否保持为 FALSE?
不可以。您不能在 Java 中覆盖静态变量。本质上发生的是子类中的定义隐藏了超类中声明的变量。
有关一个很好的示例和解释,请参阅SO Question
我还建议您自己尝试一下,看看会发生什么。