多态

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);//狗的喂养
        
    }

}


 

坚持学习,永远年轻,永远热泪盈眶
原文地址:https://www.cnblogs.com/jiang0123/p/11288855.html