Java Field Hiding

时间:2012-05-08 15:17:54

标签: java field instance-variables static-variables member-hiding

我想知道在两个java类之间隐藏一个字段是什么意思 根据结果​​输出运行代码意味着什么?

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

如果我有这段代码:

Superclass d = new subclass();

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

3 个答案:

答案 0 :(得分:10)

  • Java语言规范

      

    如果类声明了具有特定名称的字段,那么该字段的声明将被称为 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

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