如何从子类而不是超类中获取数据字段?

时间:2017-04-01 10:44:18

标签: java inheritance polymorphism

我有一个名为TestSuper

的超类
public class TestSuper {
  int a = 0;
}

我有两个名为TestSubTestSub2的子类,它们扩展为TestSuper

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

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

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

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",我该怎么办?

4 个答案:

答案 0 :(得分:3)

您需要转换引用,以便说出您想要的引用。

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();
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

你甚至非常保守在超类中保护字段并在子类中使用它。

答案 3 :(得分:0)

当您调用这样的测试方法时:

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

你使用upcasting。 Upcast分离对象的接口和实现。但是,对于分离接口和实现以及实现多态中的真实实现,必须使用多态结构。实例变量不是多态的。因此,实际上您调用的是TestSuper类中的变量。

只有实例方法是多态的。