先上题目:
interface A {
public String show();
}
class B implements A {
public String show() {
return "B";
}
}
class C extends B {
public String show() {
return "C";
}
}
public class Test {
public static void main(String[] args) {
A a = new B();
B b = new C();
A c = new C();
System.out.println(a.show() + b.show() + c.show());
}
}
给出的选项
A.CBC
B:BCC
C:CCB
D:运行时抛出异常
很明显,根据继承与多态的,lsp原则,答案为B。这时,增加main方法中条件,,如下
public static void main(String[] args) {
A a = new B();
B b = new C();
A c = new C();
c = b;
b = (B) a;
a = c;
System.out.println(a.show() + b.show() + c.show());
}
这时候,就麻烦了。仔细分析。。
- 先观察有没有编译问题。
- 最终c指向a,b实现了a,c继承了a,自然根据传递性,c也实现了a,那么a.show() 结果为C。
- 将a向下转(强转)为b后,就结束了,那么b.show()还是没动,应该是B。
- b指向c,根据lsp原则c.show()结果为C。
最后结果选A。