Во время выполнения это зависит от типа объекта, на который делается ссылка (не от типа ссылочной переменной), который определяет, какая версия переопределенного метода будет выполняться.
Ссылочная переменная суперкласса может ссылаться на объект подкласса. Это также известно как апкастинг. Java использует этот факт для разрешения вызовов переопределенных методов во время выполнения. Но вы не можете сделать наоборот.
Объявите B r1
и C r2
. Вы указываете одно и то же имя переменной для всех трех классов. Поэтому, когда вы вызываете r.j
, это дает ошибку, поскольку j является атрибутом объекта B.
То же самое объяснение для r.k
case тоже