具体来说,为什么在父类和子类中声明的变量在传递给参数是父类的方法的子类实例中是不可见的?
这是一个令我困惑的问题的简化示例。有三个类,一个父子类型和两个子子类型。这些类有一个 Foo 对象作为字段和这种静态的工厂方法:
class Parent {
public Foo myFoo;
public static ThinChild createThinChild(Foo someFoo) {
ThinChild thinChild = new ThinChild(someFoo);
return thinChild;
}
public Foo getFoo() {
return myFoo;
}
}
class ThinChild extends Parent {
public Foo myFoo;
public ThinChild(Foo someFoo) {
myFoo = someFoo;
}
}
class ThickChild extends Parent {
public Foo myFoo;
public ThickChild(Foo someFoo) {
myFoo = someFoo;
}
}
现在考虑这个处理程序类:
class ChildHandler {
private void doSomethingToThinChild(ThinChild thinChild) {
assert(thinChild.getFoo() != null);
doSomethingToAllChildren(thinChild);
}
private void doSomethingToAllChildren(Parent thinOrThickChild) {
assert(thinOrThickChild.getFoo() != null);
}
}
当我打电话doSomethingToThinChild
时,断言通过了。但在方法doSomethingToAllChildren
中,断言失败。这不是我所期望的。
此外,如果我将类中的相同getFoo
方法添加Parent
到我的ThinChild
类中,断言现在可以工作。这解决了我眼前的问题,但对我来说似乎不受欢迎,因为我现在在每个子类中维护相同的代码,而我更愿意在父类中维护它。
我的实际情况有点复杂,但我希望我已经掌握了所有相关的细节。假设我有,是否有任何解释为什么这是预期的行为?
我的实际代码中可能还有一个我没有在这里表示的复杂情况。但我首先要确认我对 Java 中的类继承的理解是正确的。
谢谢。