面向对象的三大特征:1、封装;2、继承;3、多态。
多态的概念:
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
理解:
相同的快捷键在不同软件中有不同的作用。
多态存在的三个必要条件:
1、要有继承;
2、要有重写;
3、父类引用指向子类对象(Fu f = new Zi ())
多态的好处
1、可维护性(继承体现);继承体系的存在,仅对父类的维护,即可实现多个子类的维护。
2、可扩展性(多态);父类引用指向子类对象,子类越多,多态可实现(调用)的功能越多。
多态分为两种:
1.编译多态:主要是体现在重载,系统在编译时就能通过参数类型确定调用重载函数的哪个版本。
2.运行多态:主要体现在OO设计的继承性上,子类的对象也是父类的对象,即上溯造型,所以子类对象可以作为父类对象使用,父类的对象变量可以指向子类对象。因此通过一个父类发出的方法调用可能执行的是方法在父类中的实现,也可能是某个子类中的实现(重写),它是由运行时刻具体的对象类型决定的。
代码理解:
<span style="font-family:Microsoft YaHei;font-size:12px;">public class test {
public static void main(String[] args) {
<span style="white-space:pre"> </span>A a1 = new A();
<span style="white-space:pre"> </span><span style="white-space:pre"> </span>A a2 = new B();
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>B b = new B();
<span style="white-space:pre"> </span>C c = new C();
<span style="white-space:pre"> </span>D d = new D();
<span style="white-space:pre"> </span>a1.show(b);
<span style="white-space:pre"> </span>a1.show(c);
<span style="white-space:pre"> </span>a1.show(d);
<span style="white-space:pre"> </span>a2.show(b);
<span style="white-space:pre"> </span>a2.show(c);
<span style="white-space:pre"> </span>a2.show(d);
<span style="white-space:pre"> </span>b.show(b);
<span style="white-space:pre"> </span>b.show(c);
<span style="white-space:pre"> </span>b.show(d);
}
}
class A {
public void show(D obj) {
System.out.println("A and D");
}
public void show(A obj) {
System.out.println("A and A");
}
}
class B extends A {
public void show(B obj) {
System.out.println("B and B");
}
public void show(A obj) {
System.out.println("B and A");
}
}
class C extends B {}
class D extends B {} </span>
结果:
A and A :A类中调用show()方法,传递参数类型为B类型,show(A obi)方法,参数为A类型为B类型的父类,所以能够传入B类型,故调用show(A obi)方法;
A and A :A类中调用show()方法,传递参数类型为C类型,show(A obi)方法,参数为A类型为C类型的父类的父类,所以能够传入C类型,故调用show(A obi)方法;
A and D :A类中调用show()方法,传递参数类型为D类型,按照参数类型最合适原则,show(D obj)方法,参数类型为本类,故调用show(A obi)方法;
B and A :编译时调用A类的show(A obi),运行时则调用实际类型的重写方法(动态绑定),即B类的show(A obi)方法;
B and A :编译时调用A类的show(A obi),运行时则调用实际类型的重写方法(动态绑定),即B类的show(A obi)方法;
A and D :编译时调用A类的show(D obi),运行时则调用实际类型的重写方法(动态绑定),发现实际子类B类为重写该方法,则调用父类A类的show(D obi)方法。
B and B :B类中调用show()方法,传递参数类型为B类型,按照参数类型最合适原则(最近关系类),找到show(B obj)方法,参数类型为B类,故调用show(A obi)方法;
B and B :B类中调用show()方法,传递参数类型为C类型,按照参数类型最合适原则(最近关系类),找到show(B obj)方法,参数类型为B类的父类,故调用show(A obi)方法;
A and D :B类中调用show()方法,传递参数类型为D类型,B类继承A类的show(D obj)方法,故直接调用。