我有一个名为TestSuper
public class TestSuper {
int a = 0;
}
我有两个名为TestSub
和TestSub2
的子类,它们扩展为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",我该怎么办?
答案 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
类中的变量。
只有实例方法是多态的。