4

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

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

如果我有这个代码:

Superclass d = new subclass();

超类中的布尔字段和子类中的布尔字段的值是多少?子类字段false在上面的分配之后是否保持不变?

4

3 回答 3

10
  • 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
        }
    }
    
于 2012-05-08T15:26:39.317 回答
6

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

在您的情况下,您可以像这样访问该Superclass字段:Superclass.field. Subclass和这样的实例的字段: subclass.field. 但是,如果您在上面的变量中有一个Subclass实例,则此代码:将访问中定义的静态字段,这将是您的情况。Superclassd.fieldSuperclassfalse

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

于 2012-05-08T15:22:00.020 回答
1

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

超类中变量的值field将保持为假,field子类中的值将保持为真。

在上述分配之后,子类字段是否保持为 FALSE?

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

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

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

于 2012-05-08T15:32:14.960 回答