private
成員只能在其所潔具聲明的類進行訪問。所以,如果你有類
class X{
private int field = 1;
private void method(){}
void foo(X x){
x.field = 2;
x.method(); // this is OK, because we are accessing members from instance of X
// via reference of class X (which is same class as this one)
}
void bar(Y y){// = lets assume that Y extends X
y.field = 3;
y.method(); // ERROR: we can't access `method()`
}
}
正如你看到的,我們不能從派生類訪問私有成員,即使我們在此成員被宣佈內部類。
此問題的可能原因是,私有成員不繼承到派生類(這是一種private
可見性修飾符的全部目的)的接口。因爲,在這些類的就可以重新聲明這些成員的任何方式作者希望,比如有人可能會這樣一個創建類:
class Y extends X{
private String field = "foo";
private String method(){
return "bar";
}
}
所以你看它有可能通過調用y.method()
你想訪問method
在Y
類中聲明,但是你沒有從X
類(由於封裝)訪問它。這是情景編譯器假定因爲字段和私有方法並不多態。
要通過鑄造
void bar(Y y){
((X)y).method();
}
同樣的事情發生了<T extends A>
避免這種混亂,你需要明確指出,要從當前的類X調用私有成員。由於T
可以是A
的任何子類,因此編譯器將不允許訪問其私有成員。所以,你需要將它轉換回A
class A<T extends A> {
private T one() { return (T) this;}
protected T two() { return (T) this;}
protected void three() { ((A)two()).one(); }
}
'T'是一些類延伸'A',但可能不是一個'A' –
,因爲它是受保護的!那很簡單。它是面向對象的本質。那就是爲什麼我們使用get方法返回一個變量而不是直接訪問它的對象 –
[從馬的嘴裏](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)。一個班級的孩子不能訪問父母的私人方法,因爲......這就是語言的設計。 – snickers10m