Переопределение переменных в дочерних классах

Насколько я понял, в объекте a будут доступны только те переменные и методы, которые есть в классе A, но запускаться они будут из класса B. Но вот рассмотрим код:

class A {
    int test1 = 11;
    int test2() { return 12; }
    static int test3() { return 13; }
}

class B extends A {
    int test1 = 31;
}

class C extends B {
    int test1 = 21;
    int test2() { return 22; }
    static int test3() { return 23; }
}

class Test {
    public static void main(String[] args) {
        A a1 = new A();
        System.out.println(a1.test1);   //1.
        System.out.println(a1.test2()); //2.
        System.out.println(a1.test3()); //3.
        A a2 = new C();
        System.out.println(a2.test1);   //4.
        System.out.println(a2.test2()); //5.
        System.out.println(a2.test3()); //6.
        a1 = null;
        System.out.println(a1.test3()); //7.
        System.out.println(a1.test2()); //8.
        System.out.println(a1.test1);   //9.
    }
}

Как объяснить то, что в 4 пункте выводит 11? Эта переменная же в классе C имеет значение 21.


Ответы (1 шт):

Автор решения: vanyavanya

Переменные, заданные в родительском классе нельзя переопределить в дочерних.

→ Ссылка