Насколько я понял, в объекте 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.
Прошёлся дебагером по вашему коду:
A. Переменной test1 присваивается значение 11. Выводится 11.test2() на объекте класса A. Выводится 12.test3() класса A. Выводится 13.C и помещается в переменную класса A. Поскольку поле test1 берётся у переменной класса A, то выводится 11.test2() на объекте класса C. Выводится 22.test3() класса A. Выводится 13.a1 класса A присваивается значение null. Выполняется статический метод test3() класса A. Выводится 13.test2() на объекте класса A, но этот объект равен null. Выводится NullPointerException. Выполнение кода прерывается.9 мы не дошли, но если бы в ней был вызов метода test1() на объекте класса A, тогда бы мы получили ошибку компиляции, т. к. test1 - это поле класса A, а не его метод. Если бы метод test1() существовал, тогда бы мы получили NullPointerException, т. к. объект класса A равен null.Вызов статического метода на объекте класса при компиляции заменяется на вызов метода самого класса, поэтому мы не получаем NullPointerException в случае, если объект класса равен null.
См. дополнительно: Порядок инициализации объектов в Java.
Переменные, заданные в родительском классе нельзя переопределить в дочерних.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей