2013-11-21 50 views
-2

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

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

随着下面的代码,我期望从分公司2MethodTwo()被调用。但方法从Sub1被调用。我错过了什么吗?

SuperClass anObj = new Sub2(); 
anObj.MethodOne(); 
+3

什么是init()? –

+1

如果'init()'表示'MethodOne()',则必须调用'Sub2#MethodTwo()'。你(错误地)观察到从'Sub1'的方法被调用了吗? – sp00m

+0

应该是MethodOne()。谢谢你... – Kannan

回答

1

首先,您缺少method2的实际实施。 您应该无法调用抽象方法。

您需要重写子类中的摘要。

class Sub1 extends SuperClass 
{ 
    @override 
    public void MethodTwo() 
    { 
     //code in sub1 
    } 
} 


class Sub2 extends SuperClass 
{ 
    @override 
    public void MethodTwo() 
    { 
     //code in sub2 
    } 
} 

这可能会解决您的问题。

+2

好点,但这应该是一个评论,而不是一个答案;) – sp00m

+0

现在注释并不重要... – Kannan

+0

重要的是他的方法没有被声明为“抽象”。 – ljgw

2

我已经将所有类作为内部类来帮助我测试它们。您可以从类,如果你把他们在不同的文件中删除了“静态”的文章:

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,然后用花括号{ ... }提供了一个实现。

我认为这是一个不适合你的设置的例子吗?如果是这样,我认为它不能正确地代表你的情况 - 因为它的工作方式与人们预期的一样!