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
为了避免这种混淆,您需要显式声明要通过使用强制转换从当前类X调用私有成员
void bar(Y y){
((X)y).method();
}
同样的事情也发生在 .因为编译器可以是任何子类,所以不允许访问其私有成员。因此,您需要将其转换回<T extends A>
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(); }
}