为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?
Posted
技术标签:
【中文标题】为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?【英文标题】:Why am I throwing no errors for calling object-specific methods/fields from inner classes?为什么从内部类调用特定于对象的方法/字段时没有抛出任何错误? 【发布时间】:2016-03-13 12:40:58 【问题描述】:我在我的一个 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()
的 called
字段中引发编译器错误,因为我没有给 incrementValue()
一个可以处理的对象(这就是为什么我允许将 this
传递给内部类),它完全没问题。我不确定为什么这不会给我一个错误,并且对它将调用什么实例更加困惑。
我是否误解了某种形式的引用调用,还是发生了更微妙的事情?
【问题讨论】:
一个(非静态)内部类总是隐式引用外部this
。你在这里打电话给SomeClass.this.incrementValue()
。参照***.com/questions/2731719/…
@zapl O.o 好吧,这让这更方便一点。
【参考方案1】:
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);
....
【讨论】:
以上是关于为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?的主要内容,如果未能解决你的问题,请参考以下文章