oop三大特性之一:多态
多态
多态的特点:把子类对象看成是父类对象,但是在运行时期,表示出子类的特征。所以继承是多态的前提,没有继承就没有多态。
多态:
1.父类指针指向子类的对象
2.把子类对象赋值给父类的变量
3.多态是一种链表结构
开发中涉及到多态:接口和实现类的关系
多态:一个对象可以有多种形态
比如:
Animal a = new Animal()
编译类型:把对象a看成Animal类型
运行类型:对象的真正类型可能为Dog或者其他类型
//动物类 父类 class Animal{ String name; int age; public void eat() { System.out.println("吃一般的食物"); } } //狗类 class Dog extends Animal{ String color; public void eat() { System.out.println("吃狗粮");//eat的多态体现 } } //猫类 class Cat extends Animal{ public void eat() { System.out.println("吃猫粮"); } } //多态 public class DuoTaiDemo01 { public static void main(String[] args) { /* * 创建对象 * 1.实例化 * 2.开辟空间,创建对象 * 3.赋值 */ Animal d1 = new Animal(); d1.eat(); System.out.println("--------------------------------"); Dog d2 = new Dog(); d2.name = "巴基"; d2.age = 4; d2.color = "红色"; d2.eat();
//使用多态的形式写 Animal d3 = new Dog();//父类的指针指向子类的对象 d3.eat(); //吃狗粮 System.out.println("--------------------------------"); Animal d4 = new Cat();//父类的指针指向子类的对象 d4.eat();//吃猫粮 System.out.println("--------------------------------"); Object d5 = new Cat();//Object是所有类的父类,所以可以new一个Cat出来,但是Object中没有eat()这个方法,所以new出来的对象不能使用eat方法 //d5.eat();//出错 } }
同样用动物做一个小小的例子:
要求给不同的动物喂食,每种动物的食物是不同的
class Animall{ public void eat() { System.out.println("吃食"); } } class Cat1 extends Animall{ public void eat() { System.out.println("cat吃鱼肉"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Duck extends Animall{ public void eat() { System.out.println("Duck吃泥鳅"); } } class Person{ /* * 在没有多态情况 * 必须提供很多不同动物的喂养方法重载。代码大量冗余,并且不符合程序设计的开闭原则 * 期望: * 提供一个喂养方法 * 喂养所有的动物(即多态)通过多态,添加动物品种,则可以继承动物类,重写动物类的eat方法,做到对拓展开放,对修改关闭 * ------------------------------- * 多态使得代码更简单,优化代码 */ //通过方法的重载的方式 //kat的喂养 // public void feed(Kat d1) { // System.out.println("feeding"); // d1.eat(); // } // //Duck的喂养 // public void feed(Duck d2) { // System.out.println("feeding"); // d2.eat(); // } //通过多态的方式,直接提供统一动物喂养 public void feed(Animall a) { System.out.println("feeding"); a.eat();//统一动物喂养 /* * instanceof方法 * 判断是否是某种类型 * boolean result = 对象名 instanceof 类型 */ //这实现不同的功能 if(a instanceof Cat1) { Cat1 k = (Cat1)a;//如果是猫,强制类型转化 k.catchMouse();//然后才能实现猫的特有功能,抓老鼠 } } } public class DuoTaiDemo02 { public static void main(String[] args) { Person p = new Person(); Animall c = new Cat1();//父类指针指向子类对象 Animall d = new Duck(); //k.catchMouse(); //动物没有抓老鼠的功能,所以这会报错,抓老鼠是猫的特有的功能,这样就体现了多态 p.feed(c);//猫的喂养 System.out.println("--------------------"); p.feed(d);//狗的喂养 } }