解释变量隐藏在这个Java代码中是如何工作的

Par*_*val 21 java oop inheritance

考虑下面的代码

class A
{
    int x = 5;
    void foo()
    {
        System.out.println(this.x);
    }
}
class B extends A
{
    int x = 6;
    // some extra stuff
}
class C
{
    public static void main(String args[])
    {
         B b = new B();
         System.out.println(b.x);
         System.out.println(((A)b).x);
         b.foo();
    }
 }  
Run Code Online (Sandbox Code Playgroud)

该计划的输出是

6
5
5
Run Code Online (Sandbox Code Playgroud)

我理解前两个但是无法理解最后一个.b.foo()如何打印5.B类将继承foo方法.但它不应该打印bx会打印什么?到底发生了什么?

rge*_*man 18

是的,B该类继承了该foo方法.但是变量xB隐藏xA; 它不会取代它.

这是一个范围问题.该foo方法A仅查看范围内的变量.在范围上唯一的变量是实例变量xA.

foo方法是继承的,但未被覆盖B.如果您foo使用相同的确切代码显式覆盖:

class B extends A
{
    int x = 6;

    @Override
    void foo()
    {
        System.out.println(this.x);
    }
}
Run Code Online (Sandbox Code Playgroud)

那么当引用时将在范围内的变量this.x将是B's x,并且6将被打印.虽然方法的文本是相同的,但由于范围的原因,引用是不同的.

顺便说一句,如果你真的想是指AxB类中,你可以使用super.x.