gpt4 book ai didi

java - 在Java中,为什么在父类和子类中声明的变量在子类的实例中不可见?

转载 作者:行者123 更新时间:2023-12-02 07:46:29 27 4
gpt4 key购买 nike

具体来说,为什么在父类和子类中声明的变量在传递给参数为父类的方法的子类实例中不可见?

这是一个令我困惑的问题的简化示例。共有三个类,一个父类和两个子子类。这些类有一个 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 类中完全相同的 getFoo 方法添加到我的 ThinChild 类中,则断言现在可以工作。这解决了我眼前的问题,但对我来说似乎是不可取的,因为我现在在每个子类中维护相同的代码,而我更愿意在父类中维护它。

我的实际案例有点复杂,但我希望我已经捕获了所有相关细节。假设我有,有什么解释为什么这是预期的行为吗?

我的实际代码中可能存在我未在此处表示的额外复杂情况。但我首先想确认我对 Java 中的类继承的理解是正确的。

谢谢。

最佳答案

删除public Foo myFoo。在嵌套类中,该字段从父类扩展。您无法更改它,因为您有两个同名的变量。所以JVM用较小的作用域初始化了变量。

另外一个好方法是在父级中创建构造函数:

public Parent(Foo someFoo) {
myFoo = someFoo;
}

然后在子类中调用它:

public ThinChild(Foo someFoo) {
super(someFoo);
}

关于java - 在Java中,为什么在父类和子类中声明的变量在子类的实例中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770066/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com