我有一个带有私有fieds的类,还有一个静态抽象内部类,其泛型类型扩展了外部类类型,它试图访问外部类私有字段,但得到以下错误: - 错误:a在外部有私人访问权限 - 错误:doSomething在Outer
中拥有私人访问权限见下面的代码:
public abstract class Outer extends SomeOuter
{
private Object a;
private void doSomething(){}
public static absract class Inner<T extends Outer> extends SomeOuter.SomeInner<T> {
public InnerMethod(T p) {
p.a; //error: a has private access in Outer
p.doSomething() //error: doSomething has private access in Outer
}
}
}
我正在使用jdk 1.7进行编译
任何人都可以告诉我为什么会收到此错误。
答案 0 :(得分:3)
Inner class
可以访问封闭类的private field
,static inner class
也可以访问封闭类的任何私有成员。
班级本身并非“static
”;没有静态类这样的东西。该
在这种情况下,静态修饰符表示嵌套类是外部的静态成员
类。这意味着它可以被访问,就像其他静态成员一样,没有
外部类的一个实例。
因为它是一个静态成员,所以它能够访问外部类的私有成员,因为在类私有成员中是可访问的。
例如
class One
{
private int i=0;
class Two
{
void go()
{
System.out.println(new One().i); //accessible
}
}
}
class two
{
private int i=3;
static class one
{
void go()
{
System.out.println(new two().i); //accessible in static class
}
}
}
但是,
Inner<T extends Outer> extends SomeOuter.SomeInner<T>
T是一个扩展Outer的类,并不代表它是内在的。 这就是为什么它会给出错误。
答案 1 :(得分:2)
如果您将任何方法或变量声明为私有,那么私有修饰符的工作原理就是无法在类的旁边访问它
答案 2 :(得分:2)
静态嵌入类实际上是外部类。它无法访问另一个类的私有成员。请参阅接受的答案:
答案 3 :(得分:1)
您尝试使用的Object和函数都声明为 private ,这意味着它们不能在Object之外使用。如果您也想在子类中使用它们,请将它们声明为 protected 。
答案 4 :(得分:1)
将Outer
课程的字段范围更改为protected
,以便扩展Outer
的课程可以访问这些字段。
public abstract class Outer extends SomeOuter
{
protected Object a;
protected void doSomething(){}
public static absract class Inner<T extends Outer> extends SomeOuter.SomeInner<T> {
public InnerMethod(T p) {
p.a; //error: a has private access in Outer
p.doSomething() //error: doSomething has private access in Outer
}
}
}
答案 5 :(得分:0)
这就是你拥有private
修饰符的内容。虽然它是内部类,但它无法访问外部类的私有成员。因此,将它声明为protected
,因为您正在将外部类扩展为内部类