为什么我从内部 类 调用对象特定 methods/fields 时没有抛出任何错误?
Why am I throwing no errors for calling object-specific methods/fields from inner classes?
我在我的 Java classes:
中使用了类似于以下代码的东西
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()
的 called
字段中引发编译器错误,因为我没有给 incrementValue()
一个要处理的对象(这就是为什么我允许将 this
传递给内部 class),这完全没问题。我不确定为什么这没有给我一个错误,并且进一步混淆了它 会 调用的实例。
我是不是误解了这里调用的某种形式的引用,还是发生了更微妙的事情?
called
被分配了 InnerClass
的匿名子 class 的实例。由于它是实例成员,因此在创建 SomeClass
的实例时对其进行初始化。
由于在SomeClass
的主体中声明,它是SomeClass
的内部class,可以访问SomeClass
的实例方法和成员。 incrementValue()
将在初始化 called
成员的 SomeClass
实例上执行。
如果将匿名 class 替换为等效的常规内部 class :
可能会更容易理解
public class SomeClass {
....
class SubInnerClass extends InnerClass {
public final void execute() {
incrementValue();
}
}
public final InnerClass called = new SubInnerClass(this);
....
}
我在我的 Java classes:
中使用了类似于以下代码的东西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()
的 called
字段中引发编译器错误,因为我没有给 incrementValue()
一个要处理的对象(这就是为什么我允许将 this
传递给内部 class),这完全没问题。我不确定为什么这没有给我一个错误,并且进一步混淆了它 会 调用的实例。
我是不是误解了这里调用的某种形式的引用,还是发生了更微妙的事情?
called
被分配了 InnerClass
的匿名子 class 的实例。由于它是实例成员,因此在创建 SomeClass
的实例时对其进行初始化。
由于在SomeClass
的主体中声明,它是SomeClass
的内部class,可以访问SomeClass
的实例方法和成员。 incrementValue()
将在初始化 called
成员的 SomeClass
实例上执行。
如果将匿名 class 替换为等效的常规内部 class :
可能会更容易理解public class SomeClass {
....
class SubInnerClass extends InnerClass {
public final void execute() {
incrementValue();
}
}
public final InnerClass called = new SubInnerClass(this);
....
}