java - 为什么从内部类调用特定于对象的方法/字段时没有抛出错误?

标签 java class inner-classes instance-methods

我在我的一个 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/

相关文章:

javascript - 如何添加推送到返回过滤数组的 getter 的功能?

c++ - 私有(private)枚举访问无法从嵌套类的友元函数编译

java - 如何确定 Maven 依赖项的 MySQL/MariaDB 版本?

java - 默认构造函数的隐式 super 构造函数 Num() 未定义。必须定义一个显式的构造函数,这背后的逻辑是什么

java - 将 setParameter 与节点集一起使用时,会引发异常 "Invalid conversion from java.lang.String to node-set"

Python:如何从父类(super class)创建子类?

java - Java中如何共享类对象?

java - 膨胀类 android.support.design.widget.TabLayout 时出错

python使用内部类作为静态类变量奇怪的行为

java - 更优雅的内部方法声明(没有所有的困惑)?