這裏是我的代碼使用多態可以破壞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的受保護成員(不應該成功),但成功這樣做!
我認爲我清楚地表達了區別,因爲任何不耐煩的程序員都會很快區分兩個問題。
你只是不正確地理解它。你創建了一個'B'實例。它的函數會覆蓋'A'函數,所以當你運行實例的代碼時,這就是你運行的。如果你不希望發生這種情況,請使用'private',而不是'protected'。 – UDKOX
@UDKOX他們對爲什麼'new B()。f()'不能在包'a'內工作,而看起來相同的'((A)new B())。f()'卻做到了。 –
@UDKOX顯然你根本不理解我的代碼。也許你需要仔細看代碼才能理解我的問題。我理解保護修飾符沒有任何問題。我的問題不在於誤解受保護的含義。你應該更仔細地看到整段代碼。 – Sai