2015-10-16 162 views
-2

One.java繼承和公共/私有方法

public class One { 

    private void run() { 
     System.out.println("one"); 
    } 

    public void start() { 
     this.run(); 
    } 
} 

Two.java

public class Two extends One { 
    public void run() { 
     System.out.println("two"); 
    } 
} 

Main.java

public class Main { 
    public static void main(String[] args) { 
     Two t = new Two(); 
     t.start(); 
    } 
} 

輸出:一個

但是,如果我在One類中聲明瞭run方法public,我會得到「two」作爲輸出。

這是非常不可預知的,這是如何工作的?

+6

當'''''run '方法是私人的,'兩個'不能訪問它。當它是'public'時,'Two'中的版本覆蓋它。 – JonK

+0

@JonK你不能重寫一個私有方法 – ControlAltDel

+0

@ControlAltDel我沒有說你可以。 – JonK

回答

6

Tworun方法不會被重寫private方法One運行,因爲它是private,交通不便外One任何類。

一旦方法被標記爲public,繼承系統發生,並且runstartOne調用(作爲方法沒有覆蓋),但隨後動態解析(在運行時)爲Tworun

我的建議,使用@Override註釋來確保在編譯時方法被正確覆蓋。

而且,你似乎與startrun方法被打:記得你需要extend Threadimplement Runnable爲JVM認識到你的類作爲Runnable秒。

+0

但爲什麼在私人情況'this.run()'給出輸出One的方法而不是Two的運行,因爲'This'在'Two'對象中不是'一個' – codegasmer

+2

@codegasmer http://stackoverflow.com/questions/5378995/confused-with-java-overriding-the-access-level –

0

因爲運行在One中是私有的,所以它不是動態鏈接的,也不是繼承的。在兩個運行不會覆蓋在一個

1

在Java中,private的方法是NOT對子類可見。 Protected方法ARE

Two你沒有覆蓋start()方法的類,因此t.start()使用One.start()這就要求One.run()其打印「一個」。

如果更改run()方法publicprotectedTwo類將覆蓋它,並呼籲t.start()最終會調用Two聲明的版本。

在 「流程圖」 形式:
runprivate

Two.start() - >沒有定義! - >去超類 - > One.start() - > run() - > One。run()的

runpublicprotected

Two.start() - >沒有定義! - >轉到超類 - > One.start() - > run() - > run()被子類覆蓋 - >轉到子類 - > Two.run()