我在我的一个 Java 类中使用了类似于以下代码的内容:
public class SomeClass {
private int someValue;
void incrementValue() {
someValue++;
}
public abstract static class InnerClass {
private final SomeClass toRunOn;
public InnerClass(SomeClass obj) {
toRunOn = obj;
}
public abstract void execute();
// To allow us to call this on a given instance
final SomeClass getObj() {
return toRunOn;
}
}
public final InnerClass called = new InnerClass(this) {
public final void execute() {
incrementValue(); // This is what I thought should be throwing an error
}
};
}
但是,虽然我希望这会在定义 execute()
的 known
字段中引发编译器错误,因为我没有给出 incrementValue()
code> 一个要处理的对象(这就是为什么我允许将 this
传递给内部类),它完全没问题。我不确定为什么这不会给我一个错误,并且进一步困惑它会调用什么实例。
我是否误解了某种形式的引用调用,或者是否发生了更微妙的事情?
最佳答案
called
被分配了 InnerClass
的匿名子类的实例。由于它是一个实例成员,因此当 SomeClass
的实例时它会被初始化。已创建。
由于它是在 SomeClass
的正文中声明的,它是 SomeClass
的内部类并可以访问 SomeClass
的实例方法和成员。 incrementValue()
将在SomeClass
的实例上执行其中called
成员已初始化。
如果用等效的常规内部类替换匿名类,也许会更容易理解:
public class SomeClass {
....
class SubInnerClass extends InnerClass {
public final void execute() {
incrementValue();
}
}
public final InnerClass called = new SubInnerClass(this);
....
}
关于java - 为什么从内部类调用特定于对象的方法/字段时没有抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970375/