2013-11-21 152 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,然後用花括號{ ... }提供了一個實現。

我認爲這是一個不適合你的設置的例子嗎?如果是這樣,我認爲它不能正確地代表你的情況 - 因爲它的工作方式與人們預期的一樣!