2016-05-18 33 views
-1

這裏是我的代碼使用多態可以破壞Java中受保護訪問修飾符的規則嗎?

包一個

package a; 

import static net.mindview.util.Print.print; 

import b.B; 

public class A 
{ 
    protected void f() 
    { 
     print("This is A's protected f()"); 
    } 

    public static void main(String[] args) 
    { 
     // new B().f() does not work! 
     // compiler will complain B.f() is not visible 
     A a = new B(); 
     a.f(); // but using polymorphism here! I can invoke B.f()! 
    } 
} 

套餐B

package b; 

import static net.mindview.util.Print.print; 

import a.A; 

public class B extends A 
{ 
    protected void f() 
    { 
     print("This is B's protected f()"); 
    } 
} 

的問題是在主AF()()實際上調用了B類的保護覆蓋f()的哪個類別A沒有訪問權限。

請注意,A是B的超類,它們在不同的包中。 A沒有訪問B的f()。

從技術上講,B的受保護的f()只能從其子類或同一包中的類訪問。

但無論條件是由A級滿足

所以,在這裏我的問題是不實際的多態性打破保護訪問修飾符的規則,或者是有通話過程中發生的任何隱含的和隱藏的機制?

任何人都可以幫忙嗎?

非常感謝。

打印結果爲「這是B的保護f()」。

這是一個完全不同的問題,從「瞭解java的受保護的修飾符」。請仔細看代碼!!!!

在那個問題中,C - > A關係。在C(子類)中創建一個A a = new A()(超類),並嘗試訪問受保護的成員,但未能這樣做。

在我的問題中,B - > A的關係。在「A」(超類)中創建一個「B」b = new B()(子類),並嘗試訪問b的受保護成員(不應該成功),但成功這樣做!

我認爲我清楚地表達了區別,因爲任何不耐煩的程序員都會很快區分兩個問題。

+0

你只是不正確地理解它。你創建了一個'B'實例。它的函數會覆蓋'A'函數,所以當你運行實例的代碼時,這就是你運行的。如果你不希望發生這種情況,請使用'private',而不是'protected'。 – UDKOX

+1

@UDKOX他們對爲什麼'new B()。f()'不能在包'a'內工作,而看起來相同的'((A)new B())。f()'卻做到了。 –

+0

@UDKOX顯然你根本不理解我的代碼。也許你需要仔細看代碼才能理解我的問題。我理解保護修飾符沒有任何問題。我的問題不在於誤解受保護的含義。你應該更仔細地看到整段代碼。 – Sai

回答

1

問題是main()中的a.f()實際上調用了類B沒有訪問權限的類B的保護重寫的f()。

錯誤。類A可以訪問所有自己的成員及其覆蓋。

請注意,A是B的超類,它們在不同的包中。 A沒有訪問B的f()。

你一直在說,但它仍然是錯誤的。

從技術上講,B的受保護的f()只能從其子類或同一包中的類訪問。

錯誤。

但無論條件是由A級

他們沒有滿足於得到滿足,因爲你只是做起來。

所以,在這裏我的問題是不實際的多態性打破保護訪問修飾符的規則

號你有規則錯誤。

或者在調用過程中是否存在任何隱式和隱藏機制?

有一個堅持JLS #6.6.2.1,你顯然沒有看過,並說:

則允許訪問,當且僅當E的類型爲S或S類的子類

你繼續說:

距離Understanding java's protected modifier一個完全不同的問題。

這是一個稍微不同的問題,具有相同的答案。同樣的規則適用。 JLS#6.6.2.1。

具體地,在你的情況SAE一項隱含this,和thisB類型,這是一個A亞類的。 QED

+0

我想我們在這裏都有一些誤解。我仔細看過JLS#6.6.2.1。這只是說明保護是如何工作的。我的問題不是保護是如何工作的。我知道爲什麼新的B.f()不起作用。我想知道爲什麼多態性使得B的F()A.可以內 – Sai

+0

調用@Sai你'了'是B'的'實例,並在Java中,當你有一個類的實例,你調用了方法類(在這種情況下是'B')。我的意思是,這是虛擬方法的全部*點。 – hyde

相關問題