调用子子类的方法

时间:2013-11-21 11:07:02

标签: java inheritance

我在从超类继承的第二级调用类的方法时遇到问题。 情景就是这样,

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

2 个答案:

答案 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
    }
}

这可能会解决您的问题。