面向对象程序设计的三大支柱是封装、继承和多态。
多态性概念:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
多态体现为父类引用变量可以指向子类对象
子类继承父类,编写一个可以指向子类的父类类型引用,该引用既可以处理父类对象,也可以处理子类对象当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为
子类引用的对象转换为父类类型称为向上转型。也就是将子类对象转为父类对象。
向上转型后父类不能调用子类自己的方法
案例:
class Animal { public void eat(){ System.out.println("animal eatting..."); } } class Cat extends Animal{ public void eat(){ System.out.println("鱼"); } } class Dog extends Animal{ public void eat(){ System.out.println("骨头"); } public void run(){ System.out.println("跑"); } } public class book { public static void main(String[] args) { Animal animal = new Cat(); //向上转型 animal.eat(); animal = new Dog(); animal.eat(); } } //鱼 //骨头
代码中Animal animal = new Cat(),即是将子类对象Cat转化为父类对象Anima。而animal调用的方法是子类的方法。
向上转型的使用格式:父类类型 变量名 = new 子类类型();
向下转型
一个向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用类型。
public static void eat(Animal a){ if(a instanceof Dog){ Dog d = (Dog)a; d.eat();//向下转型 d.run(); } if(a instanceof Cat){ Cat c = (Cat)a;//向下转型 c.eat(); System.out.println("我也想跑,但是不会"); } }
代码中的instanof关键字用于判断某个对象是否属于某种数据类型。返回值为布尔类型。
向下转型使用格式:子类类型 变量名 = (子类类型) 父类类型变量;
继承:在多态中必须存在有继承关系的子类和父类
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象。只有这样该引用才能够具备技能调用父类的方法和子类的方法。
实现多态的技术称为:动态绑定——父类引用指向的或这调用的方法时子类的方法。
1、可替换性。多态对已存在代码具有可替换性。
2、可扩充性。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。
3、接口性。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4、灵活性。它在应用中体现了灵活多样的操作,提高了使用效率。
5、简化性。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。