Рассмотрим ниже код
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();
    }
 }  
 Вывод программы
6
5
5
 Я понимаю первые два, но не могу окунуться в последнюю. Как b.foo() печатает 5. Класс B наследует метод foo. Но не следует ли печатать, что будет печатать bx? Что именно здесь происходит?