Потому что вы имеете в виду поля, которые не подвержены полиморфизму. Если бы вы вместо этого использовали getX()
, он бы возвратил 2
.
То, что вы спрашиваете, это значение поля x
, определенного в классе A
(потому что Base.getObject()
возвращает A
). Даже если CovariantReturn
переопределяет метод для возврата B
, вы не ссылаетесь на свой объект как CovariantReturn
.
Чтобы немного рассказать о том, как на поля не влияет полиморфизм - доступ к полям реализуется во время компиляции, поэтому, что бы ни видел компилятор, это и есть доступ. В вашем случае метод определяет, чтобы возвратить A
, и поэтому A.x
доступен. С другой стороны, методы вызываются на основе типа времени выполнения. Таким образом, даже если вы определите, чтобы вернуть A
, но вернуть экземпляр B
, метод, который вы вызываете, будет вызван на B
.