多态定义:
某一类事物的多种存在形态。
同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如下图:
多态的好处:
1.消除类型之间的耦合关系
2.可替换性
3.可扩充性
4.接口性
5.灵活性
6.简化性
最重要的一点就是,使程序有良好的扩展,并可以对所有类的对象进行通用处理。
多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。
多态的前提:
1.必须有继承关系;
2.要有方法重写;
3.要有父类引用指向子类对象。
Parent p = new Child()
注意:
当使用多态方式调用方法时,首先检查父类中是否有该方法。
如果没有,即编译错误;如果有,再去调用子类的同名方法。
其实,多态的最终目的就是调用子类中重写后的同名方法
多态的特点:
成员变量:
只看引用变量所属的类。
编译时:参考引用型变量所属的类中是否有调用的成员变量,有,编译通过,没有,编译失败;
运行时:;
(简单说:编译和运行都看等号的左边)
构造方法:
创造子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
(简单说:编译和运行都看左边)
成员方法:
编译时:参考引用型变量所属的类中是否有调用的成员方法,有,编译通过,没有,编译失败;
运行时:因为子类的方法对父类的方法进行了重写,所以运行结果为右边子类的方法;
(简单说:编译看左边,运行看右边)
静态方法:
举例:
1 class A{
2 public void show(){
3 show2();
4 }
5 public void show2(){
6 System.out.println("I");
7 }
8 }
9 class B extends A{
10 public void show2(){
11 System.out.println("love");
12 }
13 }
14 class C extends B{
15 public void show(){
16 super.show();
17 }
18 public void show2(){
19 System.out.println("you");
20 }
21 }
22 public class DuoTaiTest3{
23 public static void main(String[] args){
24 A a = new B();
25 a.show();
//编译看左边:对象a所在的类A中有show()方法,所以编译通过
//运行看右边:类B中没有show()方法,所以继承父类A的show()方法,调用show2()方法
26
27 B b = new C();
28 b.show();
//编译看左边:对象b所在的类B中没有show()方法,但会继承其父类A的show()方法,所以编译通过
//运行看右边:类C中有show()方法,是调用父类B的show()方法,而父类B是继承A的show()方法,所以还是调用show2()方法
29 }
30 }
多态的转型:
比如上面实例中的:A a = new B();
这就是向上转型,将B类型自动向上提升成了A类型,但是无法访问A类型自有的特有功能。(作用就是限制访问特有功能)
再比如:B b = (B)a;
这就是向下转型,将A类型向下转成了B类型,使之具有B类型的特有功能,可以调用B类的成员方法。
注:对于转型,自始自终都是子类对象在做着类型的变化。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否知否,应是绿肥红瘦!