首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中,如果一个子类用一个实例子变量隐藏了一个静态父变量,那么继承方法将使用哪个变量?

在Java中,如果一个子类用一个实例子变量隐藏了一个静态父变量,那么继承方法将使用哪个变量?
EN

Stack Overflow用户
提问于 2011-12-30 06:59:57
回答 6查看 9.6K关注 0票数 8

正如Can parent and child class in Java have same instance variable?中所讨论的,这可能是一件糟糕的事情。(如果父变量名被更改了怎么办?那么它将不再被遮蔽。)然而,我仍然很好奇,不同静态/非静态的变量是否会相互遮蔽。一方面,我认为它们是相同的变量名,因此会被屏蔽,但另一方面,编译器似乎可能会根据静态来区分这两个变量。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-12-30 07:26:33

来自The Java Language Specification

如果表达式名称由单个标识符组成,则必须恰好有一个可见声明,用于表示该标识符出现时作用域中的局部变量、参数或字段。否则,将发生编译时错误。

如果声明声明了一个最终字段,则该名称的含义就是该字段的值。否则,表达式名称的含义是由声明声明的变量。

如果超类中的方法引用该类的特定字段(静态字段或其他字段),则此时只有该类的字段声明在作用域中;子类的任何字段(静态字段或其他字段)都不在作用域中。因此,该方法将始终使用超类字段,即使子类继承了它并隐藏了该字段。

这个答案是根据我对这个问题的新理解完全重写的。下面是我的第一个答案,留给后人。

来自The Java Language Specification

名为n的字段、局部变量、方法参数、构造函数参数或异常处理程序参数的声明d隐藏了其他任何字段、局部变量、方法参数、构造函数参数或名为n的异常处理程序参数的声明,这些字段、局部变量、方法参数、构造函数参数或异常处理程序参数在d的整个作用域中出现d的点。

这表明编译器需要隐藏父变量,而不管静态程度如何。

请注意,所有这些都与继承的方法无关,继承的方法总是使用原始变量,而不管子类是否隐藏了它们。我怀疑这不是你想问的。

票数 4
EN

Stack Overflow用户

发布于 2011-12-30 07:23:00

根据Java语言规范:

如果类声明了一个具有特定名称的字段,那么该字段的声明就被认为隐藏了超类和类的超接口中具有相同名称的字段的任何和所有可访问的声明。

可以使用限定名称访问隐藏字段(如果它是静态的)

JVM Specification

你可以参考“字段声明”部分。

票数 7
EN

Stack Overflow用户

发布于 2011-12-30 07:24:33

他们将:

代码语言:javascript
运行
复制
class Parent {
    static String x="static in parent";
    String y="instance in parent";
}
class Child extends Parent {
    static String y="static in child";
    String x="instance in child";
    void foo() {
        System.out.println("x "+x);
        System.out.println("super.x " + super.x); 
        System.out.println("y "+y);
        System.out.println("super.y " + super.y); 
    }
}
public class Main {
    public static void main(String[] args) {
        Parent parent=new Parent();
        Child child=new Child();
        System.out.println("Parent.x "+Parent.x);
        System.out.println("parent.x "+Parent.x); 
        System.out.println("parent.y "+parent.y);
        System.out.println("child.x "+child.x);
        System.out.println("Child.y "+Child.y);
        System.out.println("child.y "+child.y);
        System.out.println("(Parent)child).x "+((Parent)child).x);
        System.out.println("(Parent)child).y "+((Parent)child).y);
        child.foo();
    }
}



Parent.x static in parent
parent.x static in parent
parent.y instance in parent
child.x instance in child
Child.y static in child
child.y static in child
(Parent)child).x static in parent
(Parent)child).y instance in parent
x instance in child
super.x static in parent
y static in child
super.y instance in parent
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8674474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档