多态是同一个行为具有多个不同表现形式或形态的能力。
父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为
多态现实意义理解:
- 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
- Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
多态体现为父类引用变量可以指向子类对象。
多态向上转型语法格式:
Parent p = new Child();
多态存在的三个必要条件:
- 继承 在多态中必须存在有继承关系的子类和父类。
- 重写 子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的
方法。
- 向上转型 在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
重点:当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
重载式多态,也叫编译时多态。也就是说这种多态在编译时已经确定好了。重载大家都知道,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。
重写式多态,也叫运行时多态。这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。
这种多态通过函数的重写以及向上转型来实现。
多态中成员的特点
- 多态成员变量:编译运行看左边
成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,属于静态绑定
Fu f=new Zi();
System.out.println(f.num);//f是Fu中的值,只能取到父中的值
2.多态成员方法:编译看左边,运行看右边
成员方法与引用变量实际引用的对象的方法动态绑定,去看对象实际类型进行调用方法
Fu f1=new Zi();
System.out.println(f1.show());//f1的声明类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
3.构造方法:
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化
多态其余转型问题下期共同讨论。