【问题标题】:How can I get the data fields from subclass not superclass?如何从子类而不是超类获取数据字段?
【发布时间】:2017-04-01 10:44:17
【问题描述】:

我有一个名为TestSuper的超类

public class TestSuper {
  int a = 0;
}

我有 2 个名为 TestSubTestSub2 的子类扩展 TestSuper

public class TestSub extends TestSuper{
   int a=1;
}

public class TestSub2 extends TestSuper{
   int a=2;
}

在我的主类中,我创建了一个方法,该方法接受 TestSuper 类型并返回它的值,并在主类中将其显示在控制台上

public class Main {
public static void main(String[] args){

    System.out.println(test(new TestSub())+" "+test(new TestSub2()));
}
public static int test(TestSuper b){
    return b.a;
}
}

但是输出是“0 0”而不是“1 2”,我该怎么办?

【问题讨论】:

  • 您只能覆盖子类中的方法。您不能覆盖字段。
  • 只需在你的子类中添加一个契约TestSub(){ a = 1;}

标签: java inheritance polymorphism


【解决方案1】:

你需要投射参考,所以说你想要哪个。

public static int test(TestSuper b){
    return b instanceof TestSub ? ((TestSub) b).a :
           b instanceof TestSub2 ? ((TestSub2) b).a :
           b.a;
}

如果这看起来不必要地复杂,那就是。您应该改用多态性。

public class TestSuper {
    int a = 0;
    public int getA() { return a; }
}

public class TestSub extends TestSuper {
    int a = 1;
    public int getA() { return a; }
}

public class TestSub2 extends TestSuper {
    int a = 2;
    public int getA() { return a; }
}

public static int test(TestSuper b) {
    return b.getA();
}

【讨论】:

  • 因此,如果您重新定义子类中的字段并将子类的实例强制转换为超类,则返回值是超类的值,但如果您通过方法请求值或获取值是返回是子类的值!!不知道,现在我想知道为什么?
  • @Charif 非静态方法遵循继承,字段不遵循。
  • 现在我正在想象那个和子类的实例,其中包含两个具有相同名称但值不同的字段。是这样的吗
  • 我读过你关于内存泄漏的博客是内存泄漏,因为在这个例子中他永远不会使用 a = 0;但总是在那里
  • @Charif 是的。字段名称理论上包括声明类。
【解决方案2】:

先了解隐藏和覆盖的区别:https://docs.oracle.com/javase/tutorial/java/IandI/override.html

然后在基类中创建一个 getter 方法,您可以在子类中覆盖它。

【讨论】:

    【解决方案3】:

    您可以研究这背后的理论,然后做唯一合理的事情——忘记编写这种代码。

    在良好的 OOP 中,您认为您的字段是您“秘密”内部实现的一部分。您不要在超类上下文中使用子类的字段。时期。

    对于在超类中保护字段并在子类中使用它,您甚至非常保守。

    【讨论】:

      【解决方案4】:

      当你像这样调用测试方法时:

      test(new TestSub())+" "+test(new TestSub2())
      

      你使用向上转换。向上转型将对象的接口和实现分开。但是为了分离接口和实现,在多态中实现真正的实现,就必须使用多态结构。实例变量不是多态的。因此,实际上你调用了一个位于TestSuper 类中的变量。

      只有实例方法是多态的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多