当我试图理解如何在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}}相关联。
你能澄清我的误解吗?
如果Parent
位于Child并且InnerClass
延伸至InnerClass
- 这种行为对我来说并不会感到惊讶。
答案 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();
containingObject
是Child
,containingObject.foo()
是定期多态调用。
当你使用内部类时,编译器会在幕后做同样的事情。