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

标签 java static compiler-errors java-7

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

见下面的代码:

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 进行编译

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

最佳答案

内部类可以访问封闭类的私有(private)字段静态内部类也可以访问封闭类的任何私有(private)成员。

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

因为是静态成员,所以可以访问外部类的私有(private)成员,因为类内部的私有(private)成员是可以访问的。

例如。

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

关于java - 静态抽象内部类访问外部类私有(private)字段java时编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17040549/

相关文章:

java - 在 JAVA 中用零初始化一个二维数组

java - 如何创建自己的资源类型注释(如 @StringRes)?

java - 在 Spring applicationContext.xml 中使用 P6Spy 和数据源

java - 使用 JBoss 和 Spring 在 Java Web 应用程序之间共享业务对象实例的最佳方式是什么?

c# - 无法在静态类上调用 GetType()

c# - 即使我将变量设为静态方法或创建相关类的新实例,我也无法访问另一个类中的变量?

ios - 魔法记录不编译

c++ - Putty-无法看到错误堆栈跟踪的顶部

android - 服务——为共享首选项声明静态字符串的最佳位置

visual-studio - 解决 "LINK : fatal error LNK1561: the entry point must be defined"