2016-06-17 40 views
5
class Clidder { 
    private final void flipper() { 
     System.out.println("Clidder"); 
    } 
} 
public class Clidlet extends Clidder { 
    public final void flipper() { 
     System.out.println("Clidlet"); 
    } 
    public static void main(String args[]) { 
     new Clidlet().flipper(); 
    } 
} 

結果是什麼?對於這個問題,我期待答案「編譯失敗」,因爲final方法不能被覆蓋,也不允許繼承。但答案是「Cliddet」,爲什麼呢?我是否誤解了這個概念中的某些東西?這怎麼可能是輸出?請解釋。確切的方法如何在java中使用最終方法

+0

有趣的邊緣情況。經驗法則:只是不這樣做:) – dimo414

+0

如果你真的想檢查最後刪除'私人'關鍵字 – emotionlessbananas

回答

4

私有修飾符指示無法從子類Clidlet中看到Clidder類中的flipper()的方法。所以它不是重寫,而只是在子類中看起來像一個新的方法聲明。私人方法/字段不能被覆蓋,因爲它不能被看到。

+0

唷!我被騙了。謝謝你解釋。 – vidya

1

private方法沒有被覆蓋,所以這裏沒有覆蓋,所以沒有違反final。實際上final上的private方法是無意義的,或者是多餘的,請選擇。

0

答案應該是「Cliddet」,因爲您的最終方法有private訪問修飾符,這使得它對於子類不可見。 Clidlet類中的鰭狀肢方法有效地在父類中隱藏了相同的方法。這是非常危險的,因爲這取決於它是從超類還是子類調用。

Clidlet clidlet = new Clidlet(); 
clidlet.flipper(); // prints Clidlet 

Clidder clidder = new Clidlet(); 
clidder.flipper(); // prints Clidder 
0

在這種情況下,private關鍵字可防止子類訪問該方法。因此Clidlet詢問Clidder有關方法屬性,接收響應「我保持私人」,並執行它自己的方法。

這種情況說明了一個事實,即private之前(具有比較高的優先級)final,即private finalprivate ==並展示了混亂它可以導致。

+0

私人+最終用途少,但它是合法的?如果沒有私人關鍵字,只有最終答案是編譯失敗,我說得對嗎? – vidya