具體來說,爲什麼在父類和子類中聲明的變量在傳遞給參數爲父類的方法的子類實例中不可見?在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
這三個類是完全不相關的。沒有課程擴展任何其他課程。處理程序不會編譯。 –