继承和多态是面向对象语言中一个比较重要的概念,本文以代码为例,简单描述java中有关多态,覆盖的基本特征。
示例代码:
/** */
/**
* @author test.java
*
*/
class A ... {
public String f(D obj) ...{
return ("A and D");
}
public String f(A obj) ...{
return ("A and A");
}
}
class B extends A ... {
public String f(B obj) ...{
return ("B and B");
}
public String f(A obj) ...{
return ("B and A");
}
}
class C extends B ... {
}
class D extends B ... {
}
public class test ... {
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// TODO Auto-generated method stub
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.f(b)); // A and A
System.out.println(a1.f(c)); // A and A
System.out.println(a1.f(d)); // A and D
System.out.println(a2.f(b)); // B and A
System.out.println(a2.f(c)); // B and A
System.out.println(a2.f(d)); // A and D
System.out.println(b.f(b)); // B and B
System.out.println(b.f(c)); // B and B
System.out.println(b.f(d)); // A and D
}
}
* @author test.java
*
*/
class A ... {
public String f(D obj) ...{
return ("A and D");
}
public String f(A obj) ...{
return ("A and A");
}
}
class B extends A ... {
public String f(B obj) ...{
return ("B and B");
}
public String f(A obj) ...{
return ("B and A");
}
}
class C extends B ... {
}
class D extends B ... {
}
public class test ... {
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// TODO Auto-generated method stub
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.f(b)); // A and A
System.out.println(a1.f(c)); // A and A
System.out.println(a1.f(d)); // A and D
System.out.println(a2.f(b)); // B and A
System.out.println(a2.f(c)); // B and A
System.out.println(a2.f(d)); // A and D
System.out.println(b.f(b)); // B and B
System.out.println(b.f(c)); // B and B
System.out.println(b.f(d)); // A and D
}
}
解析:
- 代码中的继承关系为(C|D) -> B -> A
- a1.f(b), a1.f(c)和a1.f(d)比较容易理解
- 对象a2是类B的一个实例,而在类B中,方法f(B obj)被f(A obj)所覆盖,所以a2.f(b),a2.f(c)的输出如代码中的注释所示
- 正常的多态函数调用次序如下:
- this.f(o)
- super.f(o)
- this.f((super)o)
- super.f((super)o);