多态如何为内部类工作?

时间:2014-04-20 12:14:34

标签: java inheritance polymorphism override inner-classes

当我试图理解如何在java中使用集合时,我理解我不了解多态如何对内部类起作用。

简单的代码示例:

 class Parent {
    public static void main(String[] args) {
        new Parent().newInnerClass().myMethod();
        new Child().newInnerClass().myMethod();
    }

    public I newInnerClass() {
        return new InnerClass();
    }

    private final class InnerClass implements I {

        @Override
        public void myMethod() {
            System.out.println("parent inner class");
            foo();
        }
    }

    public void foo() {
        System.out.println("foo from parent");
    }


}

class Child extends Parent {
    public void foo() {
        System.out.println("foo from child");
    }
}

interface I {
    void myMethod();
}

结果:

parent inner class
foo from parent
parent inner class
foo from child

因此,第一个链接会影响第三个方法调用。这对我来说很意外。

最初我认为需要的方法选择了linkind链接。但new Parent().newInnerClass()new Child().newInnerClass()InnerClass的{​​{1}}相关联。

你能澄清我的误解吗?

P.S。

如果Parent位于Child并且InnerClass延伸至InnerClass - 这种行为对我来说并不会感到惊讶。

1 个答案:

答案 0 :(得分:1)

内部类中没有针对多态的特殊规则。

内部阶级与普通阶级的不同之处在于两件事:

  • 内部类包含对其包含对象的隐式引用
  • 内部类可以访问其包含类的private方法(此处不相关)

这就是你可以在没有内部类的情况下重写你的例子的方法:

class Parent {
    ...
    public I newInnerClass() {
        return new NotInnerClass(this);
    }
    ...
}
class NotInnerClass implements I {
    private final Parent containingObject;

    public NotInnerClass(Parent containingObject) {
        this.containingObject = containingObject;
    }

    @Override
    public void myMethod() {
        System.out.println("parent inner class");
        containingObject.foo();
    }
}

此代码生成与您相​​同的输出,因为当您调用

new Child().newInnerClass().myMethod();

containingObjectChildcontainingObject.foo()是定期多态调用。

当你使用内部类时,编译器会在幕后做同样的事情。