面向对象有三大特性:封装、继承、多态。
本文简单谈一下对多态的粗浅理解。实现多态的技术称为动态绑定,是指在执行期间,根据引用对象的实际类型,调用相应的方法。也是就说,多态是运行期的行为,不是编译期的行为。
多态存在的3个必要性:
1、要有继承;Child继承Parent类;
2、要有重写;Child类中存在与Parent类同名同参数的方法;
3、父类的引用指向子类对象: Parent p = new Child();
当使用多态调用方法时,程序首先会检查父类中有没有该方法,如果没有,就会报错,如果存在可调用的方法,程序会转入子类的该方法的重写方法。
多态中也会涉及到类型的类型转换。
1、向上类型转换:子类的类型转换为父类的类型,不需要指定,即不需要(Parent)。
2、向下类型转换:父类的类型转换为子类的类型,需要指定,即需要(Child)。
实例(java.HighCode.DuoTai)
package java.HighCode;
class A {
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A {
public String show(B obj){
return ("B and B");
}
/*重写了A类的show(A obj)*/
public String show(A obj){
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
/**
*
* @ClassName: DuoTai
* @Description: 演示多态特性
* @author
* @date Mar 2, 2016 10:27:53 AM
*
*/
public class DuoTai {
public static void main(String[] args) {
B b = new B();
C c = new C();
D d = new D();
A a1 = new A();
System.out.println(a1.show(b));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println("----------以下体现多态性-----------");
A a2 = new B(); /*A的引用指向B类*/
/* a2调用show(b)时:
* 1、程序会先检查A类中是否有对应的方法(能找到:show(A obj),因为B类(子类)可以隐式转换为A类),
* 继续下一步;
* 2、程序再到B类中找到对应的方法(能找到:show(A obj),即B类对A类的重写方法。)
* */
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println("----------以上体现多态性-----------");
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));
}
}