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

时间:2013-06-11 09:18:58

标签: java static compiler-errors java-7

我有一个带有私有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进行编译

任何人都可以告诉我为什么会收到此错误。

6 个答案:

答案 0 :(得分:3)

Inner class可以访问封闭类的private fieldstatic 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)

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

Static nested class in Java, why?

答案 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,因为您正在将外部类扩展为内部类