3

我有一个带有私有字段的类,还有一个具有扩展外部类类型的泛型类型的静态抽象内部类,它尝试访问外部类私有字段但得到以下错误:-错误: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 进行编译

谁能告诉我为什么会出现这个错误。

4

6 回答 6

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 的类,并不意味着它是内部的。这就是为什么它给出错误。

于 2013-06-11T09:31:21.000 回答
2

如果您将任何方法或变量声明为私有,那么私有修饰符就是这样工作的,而不是在类之外无法访问事物

于 2013-06-11T09:21:59.650 回答
2

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

Java中的静态嵌套类,为什么?

于 2013-06-11T09:25:30.527 回答
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
        }
    }
} 
于 2013-06-11T09:24:38.323 回答
1

您尝试使用的 Object 和函数都被声明为private,这意味着它们不能在 Object 之外使用。如果您也想在子类中使用它们,请将它们声明为protected

于 2013-06-11T09:24:02.170 回答
0

这就是你有private修饰符的目的。虽然它是内部类,但它不能访问外部类的私有成员。因此,将其声明为protected,因为您将外部类扩展到内部类

于 2013-06-11T09:24:52.463 回答