一、多态概念
所谓多态,是指一个引用(类型)在不同情况下的多种状态。
父类的引用指向自己的子类对象,这就是多态的代码体现形式。
多态通过“继承”和“接口”两种现象构成。
二、多态的前提
类与类之间必须有关联,要么“继承”,要么“实现”
存在覆盖
三、多态好处
提高了程序的扩展性
四、多态的弊端
只能使用父类的引用访问父类的成员。
如果所创建的子类象要访问子类自己所特有的属性或访问时,则需要类型强制转换。
示例:
以下示例中,子类Cat和Dot继承了父类Animal的方法,重写了父类的方法。
在创建子类对象时,可以直接使用父类引用来引用它的子类对象。
附值=左侧的引用变量一样,对象类型由右侧实例决定。
这样,就可以用一个父类引用来创建N个子类实例,方便开发。
package javastudy; public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub /* * 以下非多态 Cat c=new Cat(); //创建子类Cat的对象 c.cry(); * * Dog d=new Dog(); //创建子类Dog的对象 d.cry(); */ // 以下为多态 myFun(new Cat()); // 直接用父类的 如果不使用以下的myFun方法,可以写成Animal a=new Cat(); a.cry();类型提升,向上转型 myFun(new Dog()); } public static void myFun(Animal a){ //相当于Animal a=new Cat(); a.cry(); } } class Animal { public void cry() { System.out.println("不知道怎么叫"); } } // 子类 class Dog extends Animal { // 狗叫 public void cry() { // 函数的重写 System.out.println("汪汪叫"); } } class Cat extends Animal { // 猫叫 public void cry() { System.out.println("喵喵叫"); } }
输出:
喵喵叫
汪汪叫
示例二
package javastudy; public class Demo2 { public static void main(String[] args) { Master master=new Master(); //创建Master实例 master.feed(new MyDog(), new Bone()); // master.feed(new MyCat(), new Fish()); } } //主人类 class Master { //给动物喂食,使用多态,方法就用一个 public void feed(MyAnimal a,Food f) { //如果再加动物和食物,feed方法名不用改,形参会自动调用 a.eat(); //调用对应的子类的方法 f.showName(); //调用对应的子类的方法 } } //动物类 class MyAnimal{ //动物会叫 public void cry() { System.out.println("不知道怎么叫"); } //动物会吃东西 public void eat(){ System.out.println("不知道喜欢吃什么"); } } //动物子类——狗 class MyDog extends MyAnimal{ //狗叫 public void cry(){ System.out.println("汪汪叫"); } //狗吃东西 public void eat(){ System.out.println("狗吃骨头"); } } //动物子类——猫 class MyCat extends MyAnimal{ //猫叫 public void cry(){ System.out.println("喵喵叫"); } //猫吃东西 public void eat(){ System.out.println("猫吃鱼"); } } //食物类 class Food { String name; public void showName(){ } } //食物的子类——鱼 class Fish extends Food{ public void showName() { System.out.println("我是一条鱼"); } } //食物的子类——骨头 class Bone extends Food{ public void showName() { System.out.println("我是一跟骨头"); } }
输出:
狗吃骨头
我是一跟骨头
猫吃鱼
我是一条鱼