为什么超级方法将此引用分发为超类型而非自有类型?
我不明白这种行为的实用性。我学会了对类型/接口进行编码而不是对类进行编码,但考虑到这种行为,我对我认为OOP所代表的一切感到困惑。这打破了清洁代码的可能性,迫使我用大量的控制流来填充它,就像大量使用 instanceof 运算符一样。 为什么这种行为甚至有意义?
摘要:
请考虑以下代码:
abstract class A {
public void visit(Target t) {
t.method(this);
}
}
如果Target
在其签名中使用A和不同的A类子类重载method()
,并且这些子项本身不会覆盖visit(Target t)
,那么将选择重载method(A a)
编译器总是。
工作示例: http://pastebin.com/EGNpY7pF
代码剪辑
public class Target {
public static abstract class A {
void visit(Target t) {
t.method(this);
}
}
public static class B extends A {}
public static class C extends A {
@Override
void visit(Target t) {
t.method(this);
}
}
void method(A a) { System.out.println("A");}
void method(B b) { System.out.println("B");}
void method(C c) { System.out.println("C");}
public static void main(String[] args) {
Target t = new Target();
A ab = new B();
B b = new B();
A ac = new C();
C c = new C();
ab.visit(t);
b.visit(t);
ac.visit(t);
c.visit(t);
}
}
输出
A A C C
由于ac
被引用为A
,因此实际上很不方便 - 类型但仍调用C
的覆盖visit()
方法。
答案 0 :(得分:0)
你的问题不清楚。当在对象的实例上调用函数时,将调用子方法,即使它被引用为其父类型;多态性。如果子进程没有覆盖该方法,那么将调用父类的方法实现;从层次结构继承。
如果一个类调用自己的方法,前缀为super,它将在层次结构中找到与签名匹配的最近实现。