2015-02-17 49 views
0

這是我的代碼爲什麼在這裏調用超類方法?

class Hello{ 
    void method(){ 
     System.out.println("super method"); 
     meth(); 
    } 
    private void meth(){ 
     System.out.println("sup meth"); 
    } 
} 
public class HelloWorld extends Hello{ 
    //@Override - would fail as meth is private in Hello 
    protected void meth(){ 
     System.out.println("sub meth"); 
    } 
    protected void method(){ 
     super.method(); 
    } 
    public static void main(String []args){ 
     new HelloWorld().method(); 
    } 
} 

返回的結果是

super method 
sup meth 

但爲什麼呢?不要它,而不是打印

super method 
sub meth 

如果我是寫在Hellometh方法,公衆和HelloWorld

結果覆蓋它WUD被上述一。 methmethod調用仍然會調用子類的meth,即使meth調用在超類中,從詞彙上講! 那麼爲什麼meth是私人時的不同行爲?

_____________Edit_____________

有碼過這樣的事情

class Hello{ 
    void method(){ 
     System.out.println("super method"); 
     meth(); 
    } 
    protected void meth(){ 
     System.out.println("sup meth"); 
    } 
} 
public class HelloWorld extends Hello{ 
    //@Override - would fail as meth is private in Hello 
    protected void meth(){ 
     System.out.println("sub meth"); 
    } 
    protected void method(){ 
     super.method(); 
    } 
    public static void main(String []args){ 
     new HelloWorld().method(); 
    } 
} 

的O/P是

super method 
sub meth 

因此,即使method在超類Hello被調用meth ,其實子類的meth就是bein g叫。所以,方法調用不在詞彙意義上!即使看起來超類的方法會被調用,其實際的子類的becoz子類實例首先調用method。 爲什麼不同meth私人超級

回答

3

當編譯器告訴你,你不能重載一個私有方法。所以超類所知道的唯一方法就是它自己的。

您不能覆蓋私有方法,因爲它是該類的內部方法,所以它的子類甚至不知道它的超級私有方法存在。

+0

我同意!但即使控件位於超類中,它仍然是調用鏡頭的子類對象。這就是爲什麼該方法不是私有的,子類方法版本會被調用。現在在這種情況下,正如你所說的,私有超類方法甚至不知道是由子類實例存在的。因此,如果子類實例實際上是從超類方法內部調用子類meth(),它就是自然的了。 請澄清我的概念是否錯誤 – Sarabjeet 2015-02-17 21:09:13

1

您的方法meth()private,並且子類無法訪問它。

+0

我同意!但即使控件位於超類中,它仍然是調用鏡頭的子類對象。這就是爲什麼該方法不是私有的,子類方法版本會被調用。現在在這種情況下,正如你所說的,私有超類方法甚至不知道是由子類實例存在的。因此,如果子類實例實際上是從超類方法內部調用子類meth(),它就是自然的了。 請澄清,如果我的觀念是錯誤的 – Sarabjeet 2015-02-17 21:08:25

0

超類從自身調用meth(),因此它正在尋找this.meth()。超級甚至不知道子類的meth(),因爲1)它在一個子類中,2)子類方法是私有的。

我會建議在繼承閱讀了: Java Inheritance

相關問題