为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?

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);

    ....

【讨论】:

以上是关于为啥从内部类调用特定于对象的方法/字段时没有抛出任何错误?的主要内容,如果未能解决你的问题,请参考以下文章

未调用特定于类的渲染器组件

Spring AOP为啥不能拦截从对象内部调用的方法

有没有办法请求特定于存储桶的读取范围?

Django:如何显示不特定于字段的验证错误?

为啥在建立与 SQL Server 的连接时会发生与网络相关或特定于实例的错误?

为啥 Windows Vista 64 位默认使用 32 位 cmd.exe? (特定于机器)