我想知道在两个java类之间隐藏一个字段是什么意思 根据结果输出运行代码意味着什么?
我有一个带有protected static boolean field = false
和子类的抽象类
它有一个具有相同名称但不是静态的布尔字段,并设置为true
。
如果我有这段代码:
Superclass d = new subclass();
超类中的布尔字段和布尔字段的值是多少?
在子类中?在上面的赋值后,子类字段是否保留为false
?
答案 0 :(得分:10)
如果类声明了具有特定名称的字段,那么该字段的声明将被称为 hide 任何和所有可访问的超类中具有相同名称的字段的声明,以及该类的超接口
如果是
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
}
}
答案 1 :(得分:6)
static
成员永远不会被覆盖(当然也不是非静态成员)。因为你应该像这样访问它们:ClassName.member
也没有必要担心隐藏它们。
在您的情况下,您可以访问Superclass
字段,如下所示:Superclass.field
。以及Subclass
实例的字段如下:subclass.field
。如果您有Subclass
变量中的Superclass
个实例,则此代码:d.field
将访问Superclass
中定义的静态字段,该字段为{{1}在你的情况下。
但是这不会改变false
实例的值,它只会访问“错误”的成员!您可以通过将Subclass
中的实例放回d
变量并再次阅读Subclass
来验证这一点。
答案 2 :(得分:1)
超类中的布尔字段的值是什么? 子类中的布尔字段?
超类中field
变量的值将保持为false,并且子类中field
的值将保持为真。
在上面的赋值之后,子类字段是否保持为FALSE?
没有。您无法在Java中覆盖静态变量。基本上发生的是子类中的定义隐藏了超类中声明的变量。
有关一个很好的示例和解释,请参阅SO Question
我还建议你亲自尝试看看会发生什么。