Java字段隐藏

我想知道在两个java类之间隐藏一个字段是什么意思,以及在结果输出方面运行代码时它意味着什么?

我有一个带有protected static boolean field = false的抽象类和一个子类,它有一个具有相同名称但不是静态的布尔字段并设置为true

如果我有这个代码:

 Superclass d = new subclass(); 

超类中的布尔字段和子类中的布尔字段的值是多少? 在上面的赋值之后,子类字段是否保持为false

非常感谢

static成员永远不会被覆盖(当然也不是非静态成员)。 因为您应该像这样访问它们: ClassName.member也无需担心隐藏它们。

在您的情况下,您将访问Superclass字段,如下所示: Superclass.fieldSubclass实例的字段如下: subclass.field 。 如果你有一个像上面这样的Superclass变量中的Subclass实例,那么这段代码: d.field将访问Superclass定义的静态字段,在你的情况下这将是false

但这不会改变Subclass实例的值,它只是访问“错误”的成员! 您可以通过将实例放回到Subclass变量并再次读取field来validation这一点。

  • Java语言规范

    如果类声明了具有特定名称的字段,那么该字段的声明将被隐藏隐藏超类中具有相同名称的字段的任何和所有可访问声明,以及该类的超接口。

    如果是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 } } 

超类中的布尔字段和子类中的布尔字段的值是多少?

超类中的field变量的值将保持为false,并且子类中的field值将保持为true。

在上面的赋值之后,子类字段是否保持为FALSE?

不可以。您无法在Java中覆盖静态变量。 本质上发生的是子类中的定义隐藏了超类中声明的变量。

有关一个很好的示例和解释,请参阅SO问题

我还建议你亲自尝试看看会发生什么。

Interesting Posts