Java 静态抽象内部类访问外部类私有字段时的编译器错误

Java 静态抽象内部类访问外部类私有字段时的编译器错误,java,static,compiler-errors,java-7,Java,Static,Compiler Errors,Java 7,我有一个带有私有域的类,还有一个带有扩展外部类类型的泛型类型的静态抽象内部类,它试图访问外部类私有域,但出现以下错误: -错误:a在外部具有私有访问权限 -错误:doSomething在外部具有私有访问权限 见下面的代码: public abstract class Outer extends SomeOuter { private Object a; private void doSomething(){} public static absract class In

我有一个带有私有域的类,还有一个带有扩展外部类类型的泛型类型的静态抽象内部类,它试图访问外部类私有域,但出现以下错误: -错误:a在外部具有私有访问权限 -错误:doSomething在外部具有私有访问权限

见下面的代码:

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
        }
    }
} 
公共抽象类Outer扩展了SomeOuter
{
私人物品a;
私有void doSomething(){}
公共静态abstract类Inner扩展了SomeOuter.SomeInner{
公共方法(TP){
p、 a;//错误:a在外部具有私有访问权限
p、 doSomething()//错误:doSomething在外部具有私有访问权限
}
}
} 
我正在使用JDK1.7进行编译


任何人都可以告诉我为什么会出现这个错误。

如果你将任何方法或变量声明为私有,那么私有修饰符就是这样工作的,因为它们不能在类之外访问。

你试图使用的对象和函数都声明为私有的,这意味着它们不能在对象之外使用。如果您想在子类中也使用它们,请将它们声明为受保护。

外部
类上的字段范围更改为
受保护
,以便扩展
外部
的类可以访问这些字段

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
        }
    }
} 
公共抽象类Outer扩展了SomeOuter
{
受保护对象a;
受保护的void doSomething(){}
公共静态abstract类Inner扩展了SomeOuter.SomeInner{
公共方法(TP){
p、 a;//错误:a在外部具有私有访问权限
p、 doSomething()//错误:doSomething在外部具有私有访问权限
}
}
} 

这就是您拥有的
专用
修饰符。虽然它是内部类,但不能访问外部类的私有成员。因此,当您将外部类扩展到内部类时,将其声明为受保护的,

静态嵌入类实际上是外部类。它无法访问另一个类的私有成员。请参阅以下问题的公认答案:


一个
内部类
可以访问封闭类的
私有字段
,一个
静态内部类
也可以访问封闭类的任何私有成员

类本身并不是真正的“
静态的”
”;没有静态类这样的东西。这个 本例中的static修饰符表示嵌套类是外部类的静态成员 班级。这意味着可以像访问其他静态成员一样访问它,而无需 外部类的实例

因为它是一个静态成员,所以它能够访问外部类的私有成员,因为类内的私有成员是可访问的

例如

但是在这里

Inner<T extends Outer> extends SomeOuter.SomeInner<T>
Inner扩展SomeOuter.SomeInner
T是一个扩展到外部的类,但并不意味着它是内部的。 这就是它出错的原因

Inner<T extends Outer> extends SomeOuter.SomeInner<T>