【问题标题】: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 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 的类,并不意味着它是内部的。
这就是它给出错误的原因。
【解决方案2】:
如果您曾经将任何方法或变量声明为私有,那么私有修饰符就是这样工作的,而不是在类之外无法访问事物
【解决方案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,因为您正在将外部类扩展到内部类