Как работает наследование Java, когда задействованы внутренние классы

У меня возникают проблемы с пониманием того, как наследование работает в Java, когда присутствуют внутренние классы. В настоящее время я работаю над тем, что дочернему классу нужно немного изменить функциональность внутреннего класса своего родителя. Ниже я привел более простой, анаггитивный пример.

Я ожидал, что этот код напечатает «Я - ChildClass.InnerClass», но вместо этого он напечатает «Я - ParentClass.InnerClass». Почему это? Кроме того, если я изменю объект obj в main на тип ChildClass, то вывод изменится на «Я - ChildClass.InnerClass». Почему это?

В общем, каков рекомендуемый способ изменения поведения внутреннего объекта родительского класса объекта?

class InnerClassTest {
   //-----------------------------------------------------------------------
   // PARENT CLASS
   class ParentClass {
      public ParentClass() {
         x = new InnerClass();
      }

      InnerClass x;

      class InnerClass {
         public void speak() {
            System.out.println("I am a ParentClass.InnerClass");
         }
      }
   }

   //-----------------------------------------------------------------------
   // CHILD CLASS
   class ChildClass extends ParentClass {
      public ChildClass() {
         x = new InnerClass();
      }

      InnerClass x;

      class InnerClass extends ParentClass.InnerClass {
         public void speak() {
            System.out.println("I am a ChildClass.InnerClass");
         }
      }
   }

   //-----------------------------------------------------------------------
   // MAIN
   public static void main(String[] args) {
      ParentClass obj = (new InnerClassTest()).new ChildClass();
      obj.x.speak();
   }
}

Ответы на вопрос(3)

Ваш ответ на вопрос