Java字段隐藏

5

我想知道如果说一个字段在两个Java类之间是隐藏的,这意味着什么,以及在运行代码时会有什么结果?

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

如果我有以下代码:

Superclass d = new subclass();

在超类和子类中,布尔字段的值将是什么?在上述赋值后,子类字段是否保持为false

3个回答

10
  • Java 语言规范

    如果某个类声明了一个字段,那么该字段的声明会隐藏该类的超类和超接口中具有相同名称的所有可访问的字段声明。

    如果该字段是static类型,则可以使用限定名称进行访问;如果是非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
        }
    }
    

6
static成员永远不会被覆盖(当然也不会被非静态成员所覆盖)。因此,您应该像这样访问它们:ClassName.member,也不需要担心隐藏它们。
在您的情况下,您将像这样访问Superclass字段:Superclass.field。而一个Subclass实例的字段就像这样:subclass.field。但是,如果您在上面的Superclass变量中有一个Subclass实例,那么这段代码:d.field 将访问在Superclass中定义的静态字段,在您的情况下将是false
但这并不会改变Subclass实例的值,它只是访问“错误”的成员!您可以通过将实例放回到d中的Subclass变量中并再次读取field来验证这一点。

谢谢,这真的很有帮助。 - daveb
我想补充一下为什么会发生这种情况,因为我也不得不搜索才找到答案。在这里找到了答案:(http://www.xyzws.com/Javafaq/what-is-variable-hiding-and-shadowing/15)“因为Java中的变量名称是由引用类型而不是它们所引用的对象解析的。” - Kirill Yunussov

1
在超类中,布尔字段的值将保持为false,在子类中,布尔字段的值将保持为true。
子类字段在上述赋值后是否保持为FALSE?
不是的。在Java中,您无法覆盖静态变量。实际上发生的是,子类中的定义隐藏了超类中声明的变量。
有一个很好的例子和解释,请参见SO Question 我还建议您自己尝试一下,看看会发生什么。

感谢Suresh提供的示例,我会尝试一下。 - daveb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接