具体来说,为什么在父类和子类中声明的变量在传递给参数为父类的方法的子类实例中不可见?在Java中,为什么在父类和子类中声明的变量在子类的实例中不可见?
这是一个令我困惑的问题的简单例子。有三个类,一个父类和两个子类。该班有一个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
中,断言失败。这不是我所期望的。
此外,如果我在Parent
类中为我的ThinChild
类添加了相同的确切getFoo
方法,则断言现在可用。这解决了我眼前的问题,但对我来说似乎不受欢迎,因为我现在在每个子类中保持相同的代码,我只是希望将其保留在父代中。
我的实际情况有点复杂,但我希望我已经记录了所有相关的细节。假设我有,是否有解释为什么这会是预期的行为?
有可能是我的实际代码中有一个额外的复杂因素,我没有在这里表示。但是我首先想确认我对Java中的类继承的理解是正确的。
谢谢。
你是说'class ThinChild extends Parent'? – alaster
您不需要在嵌套类中声明 'public Foo myFoo;'。 myFoo已经有 – alaster
这三个类是完全不相关的。没有课程扩展任何其他课程。处理程序不会编译。 –