Java 静态抽象内部类访问外部类私有字段时的编译器错误
我有一个带有私有域的类,还有一个带有扩展外部类类型的泛型类型的静态抽象内部类,它试图访问外部类私有域,但出现以下错误: -错误:a在外部具有私有访问权限 -错误:doSomething在外部具有私有访问权限 见下面的代码: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
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>