То, что B
, C
, D
наследуется от A
, не означает, что их field g
будет инициализировано для чего-либо. Каждый созданный объект все еще является независимым объектом, просто потому, что вы объявили объект типа A, не означает, что каждый экземпляр класса, который наследуется от A, будет содержать то же значение поля, что и экземпляр A, который вы создаете. Вы должны установить field g
каждого производного класса, вызывая метод something()
, поэтому измените свой код на следующий:
B b = new B();
C c = new C();
D d = new D();
d.something(x);
c.something(x);
b.something(x);
b.methodB();
c.methodC();
d.methodD();