<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
輸出:
private f()
deri bar
為什麼呢
<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
輸出:
private f()
deri bar
為什麼呢
首先這裡並非直接呼叫private
的f()
方法,就像getter
方法能拿到private
實例變數一樣,這個無需解釋。
這裡有個繼承的問題: Derived
類裡的f方法
並非是其父類PrivateOverride f方法
的重寫, 因為重寫方法要求重寫後方法的訪問權限修飾符不能比父類別更嚴格,在hello
方法裡執行this.f()
,編譯器優先找最近的f
(即父類的f
),所以打出了private f()
。
當然,在實際開發中,要盡量避免這種混淆,做做基礎面試題還可以。
你是透過公有的方法去存取私有的方法,這是可以的
public void hello() 是公有方法
它是允許呼叫本類別的私有方法
依照你上述的例子並不能說子類別能存取父類別的私有方法。因為hello
本身就是父類別的方法。
如果子類別是這樣:
<code>class Derived extends PrivateOverride { public void hello() { System.out.println("public f()"); } public void bar(){ this.f(); //... } }</code>
如果能正常運作才能說明子類別能夠存取父類別的私有方法。