【问题标题】:Compiler errors when static abstract Inner class accesses outer class private fields java静态抽象内部类访问外部类私有字段java时的编译器错误
【发布时间】:2013-06-11 09:18:57
【问题描述】:

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

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

【问题讨论】:

    标签: java static compiler-errors java-7


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        静态嵌入类实际上是一个外部类。它不能访问另一个类的私有成员。查看接受的答案:

        Static nested class in Java, why?

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            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
                    }
                }
            } 
            

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 2014-02-11
                • 1970-01-01
                • 2018-01-04
                • 2021-04-21
                • 1970-01-01
                • 1970-01-01
                • 2015-08-01
                • 2014-06-19
                相关资源
                最近更新 更多