我在从超类继承的第二级调用类的方法时遇到问题。 情景就是这样,
abstract class SuperClass
{
public void MethodOne()
{
MethodTwo();
}
public abstract void MethodTwo();
}
class Sub1 extends SuperClass
{
public void MethodTwo()
{
//code in sub1
}
}
class Sub2 extends SuperClass
{
public void MethodTwo()
{
//code in sub2
}
}
使用以下代码,我希望调用 Sub2 中的 MethodTwo() 。但是来自 Sub1 的方法正在被调用。我错过了什么吗?
SuperClass anObj = new Sub2();
anObj.MethodOne();
答案 0 :(得分:2)
我已将所有类组合为内部类,以帮助我测试它们。如果将它们放在不同的文件中,可以从类中删除“static”关键字:
public class Example {
abstract static class SuperClass
{
public void MethodOne()
{
MethodTwo();
}
public abstract void MethodTwo();
}
static class Sub1 extends SuperClass
{
@Override
public void MethodTwo()
{
System.out.println("Sub1.MethodTwo()");
}
}
static class Sub2 extends SuperClass
{
@Override
public void MethodTwo()
{
System.out.println("Sub2.MethodTwo()");
}
}
public static void main(String[] args) {
SuperClass anObj = new Sub2();
anObj.MethodOne();
}
}
当我运行这个类时,它输出Sub2.MethodTwo()
,证明它确实按预期工作。
我注意到你提供的代码不是正确的java代码,也没有编译。那是因为您已将方法标记为abstract
,然后提供了大括号{ ... }
的实现。
我认为这是一个不适合您的设置示例?如果是这样的话,我认为它并不能恰当地代表你的情况 - 因为它正如人们期望的那样工作!
答案 1 :(得分:1)
首先,您缺少method2的实际实现。 你不应该调用抽象方法。
您需要覆盖子类中的抽象。
class Sub1 extends SuperClass
{
@override
public void MethodTwo()
{
//code in sub1
}
}
class Sub2 extends SuperClass
{
@override
public void MethodTwo()
{
//code in sub2
}
}
这可能会解决您的问题。