内部クラスが存在する場合、Javaで継承がどのように機能するかを理解するのに問題があります。私は現在、子クラスがその親の内部クラスの機能をわずかに変更する必要がある何かに取り組んでいます。以下に、より単純で類似した例を考え出しました。
このコードは「私はChildClass.InnerClassです」と出力することを期待していましたが、代わりに「私はParentClass.InnerClassです」と出力します。どうしてこれなの?また、mainのobjオブジェクトをChildClass型に変更すると、出力は「IamaChildClass.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();
}
}