Java的字段隐藏(Java Field Hiding)

2019-06-24 06:05发布

我想知道是什么意思,说一个字段2 Java类和什么导致输出方面运行的代码时,它意味着之间隐藏?

我有一个抽象类protected static boolean field = false ,并且具有相同名称的布尔领域,但也不是一成不变的,并设置为一个子类true

如果我有这样的代码:

Superclass d = new subclass();

这将是在子类中的父类和布尔字段的布尔字段的值? 难道子场留为false上述分配后?

Answer 1:

static成员从不(非静态成员当然也不是)覆盖。 既然你应该像这样访问他们: ClassName.member也没有必要担心隐藏它们。

在你的情况,你就可以访问Superclass领域是这样的: Superclass.field 。 和领域Subclass这样的实例: subclass.field 。 如果你有,但一个Subclass的实例Superclass像上面的变量,这个代码: d.field将访问中定义的静态字段Superclass ,这将是false ,你的情况。

但是,这并不能改变价值Subclass的实例,它只是访问“错误”的成员! 你可以把例如在验证这个d回到一个Subclass变量和阅读field一次。



Answer 2:

  • 如果类声明的字段具有特定名称,那么该字段的声明说, 隐藏在超具有相同名称字段的任何和所有可访问的声明和类的超级。

    隐藏字段可以通过使用限定名,如果它是被访问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 } } 


Answer 3:

这将是在子类中的父类和布尔字段的布尔字段的值?

field中的超可变仍将虚假和价值field中的子类仍将如此。

难道子场停留上述分配后为FALSE?

不,你不能在Java中覆盖静态变量。 什么实际上发生的事情是在子类中的定义隐藏在超类中声明的变量。

对于一个很好的例子和说明,请参阅SO问题

我也建议你自己尝试一下,看看会发生什么。



文章来源: Java Field Hiding