Java 字段隐藏

Posted

技术标签:

【中文标题】Java 字段隐藏【英文标题】:Java Field Hiding 【发布时间】:2012-05-17 02:34:33 【问题描述】:

我想知道说一个字段隐藏在 2 个 java 类和 根据结果​​输出运行代码意味着什么?

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

如果我有这个代码:

Superclass d = new subclass();

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

【问题讨论】:

【参考方案1】:

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
    

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

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

超类中布尔字段的值是什么? 子类中的布尔字段?

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

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

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

有关很好的示例和说明,请参阅SO Question

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

【讨论】:

感谢 Suresh 提供的示例,我将试一试

以上是关于Java 字段隐藏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在 Selenium WebDriver 的隐藏字段中键入一些文本

在java swing Jtable中设置隐藏字段值

隐藏字段上的 Dojo Onchange 事件

使用来自 javascript 的返回值自动填充隐藏的表单字段

JAVA封装字段快捷键或快速封装是哪个?

使用 h:selectBooleanCheckbox 显示/隐藏另一个输入字段