【发布时间】:2021-05-30 13:22:46
【问题描述】:
在 Java 中,内部类通常可以访问外部类的私有成员。 在编写 Android 应用程序时,我有一个静态内部类,它扩展了它的外部类。 结果,无法访问外部类的私有字段:
class Outer {
private int m_field = 1;
static class Inner extends Outer {
Inner() {
m_field = 2;
}
}
}
它给出了一个令人困惑的错误消息:
错误:不能从静态上下文中引用非静态变量 m_field
即使除了类本身之外没有什么是静态的。
当字段 m_field 被保护时,它编译没有问题。 但是,当这样做时:
class Outer {
private int m_field = 1;
static class Inner extends Outer {
Inner() {
((Outer)this).m_field = 2;
}
}
}
它可以正常工作。 这是编译器中的错误吗?为什么需要强制转换为已经是实例的外部类?
编辑:
对于这个的真实用例,考虑这样一个类:
public abstract class MyItem {
private int m_counter = 0;
public abstract int updateSomething();
public static class CountItem extends MyItem {
public int updateSomething() { m_counter++; }
}
public static class DoubleCountItem extends MyItem {
public int updateSomething() { m_counter += 2; }
}
}
相当抽象的例子,但它可以用来为不需要大量代码的抽象类提供基本实现。
EDIT2:
正如@Nathan 建议的那样,这个问题似乎可以通过 2 个类重新创建而无需嵌套:
class Base {
private int x = 0;
void a(Extended b) {
((Base)b).x = 1; //<-- with cast: compiles, without: error
}
}
class Extended extends Base {
}
哪个给出更好的错误信息:
错误:x 在 Base 中有私有访问权限
【问题讨论】:
-
你到底为什么要让一个内部类扩展它的外部类?这真是自找麻烦。
-
我不这么认为——考虑一个抽象类,它已经提供了自身的基本实现,可能只有一个抽象方法实现。我不想为此创建一个新的源文件。
-
创建一个内部类只是为了避免它有点疯狂:p(从可读性的角度来看)
-
我认为在具体类很小的情况下可以提高可读性。
-
这不是内部类。它是一个嵌套类,也是一个静态类。使它成为非静态的,即内部的,问题就会消失。你写的代码没有意义。
标签: java