• 多态


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


     

    坚持学习,永远年轻,永远热泪盈眶
  • 相关阅读:
    对象关系【继承】【依赖】【关联】【聚合】【组合】
    对象关系【继承】【依赖】【关联】【聚合】【组合】
    Spring使用p名称空间配置属性
    Spring使用p名称空间配置属性
    spring实例化bean的方式
    MS04011远程缓冲区溢出代码
    注入下载文件的代码到IE进程然后执行下载的文件
    缓冲区溢出漏洞发掘之整数范围限制浅析
    基于ICMP的木马的编写
    凯撒密文的破解编程实现
  • 原文地址:https://www.cnblogs.com/jiang0123/p/11288855.html
Copyright © 2020-2023  润新知