多态、多态的好处(扩展性)

多态

1、多态:同一个对象,在不同时刻体现出来的不同状态。 2、多态的前提:   1)要有继承关系或实现关系(接口);   2)要有方法重写;   3)要有父类或者父接口引用指向子类`Fu f= new Zi(); 注意:形参实参形式的(形参父类实参子类)。 3、多态的分类:   1)具体类多态

class Fu{}class Zi extends Fu{}

Fu f= new Zi()//父类引用指向子类

  2)抽象类多态(常用)

abstract class Fu{}class Zi extends Fu{}

Fu f= new Zi();//抽象父类引用指向子类

  3)接口多态(常用)

interface Fu{}class Zi implements Fu{}

Fu f= new Zi();//父接口引用指向子类

多态中成员访问特点

如,Fu f= new Zi();//左父类右子类

重点:成员方法,运行时,结果为子类重写的成员方法的结果。

  • 成员变量:编译看左边,运行看左边。
  • 构造方法:创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
  • 成员方法:编译看左边,运行看右边。(方法重写的意义)
  • 静态方法:编译看左边,运行看左边。静态和类相关,算不上重写,所以访问还是左边的。

提醒:理解这些的时候要记得继承啊方法重写它们存在的意义所在。就好理解啦。


多态的好处

提高了代码的维护性(继承保证);提高了代码的扩展性。 原代码,不易扩展: (借用本代码,也进一步理解一下工具类)

//父类:动物类class Animal{
    public void eat(){
        System.out.println("eat");
    }    public void sleep(){
        System.out.println("sleep");
    }
}//猫类class Cat extends Animal{
    //方法重写
    public void eat(){
        System.out.println("狗吃肉");
    }    //方法重写
    public void sleep(){
        System.out.println("狗坐着睡");
    }
}//狗类class Dog extends Animal{
    public void eat(){
        System.out.println("猫吃鱼");
    }    public void sleep(){
        System.out.println("猫趴着睡");
    }
}//添加猪类class Pig extends Animal{ //----------note:老忘记写extends!!!!!!!!!!
        public void eat(){
        System.out.println("猪吃白菜");
    }    public void sleep(){
        System.out.println("猪躺着睡");
    }
}//针对动物操作的工具类class AnimalTool{

    private AnimalTool(){}//最好把工具类的构造方法私有,防止别人创建该类的对象。该类是工具类。

    //调用猫的功能
    public static void feedCat(Cat c){  //工具类,方法就写成static的,然后直接在测试类:工具类名.方法 使用。
        c.eat();
        c.sleep();
    }    //调用狗的功能
    public static void feedDog(Dog d){
        d.eat();
        d.sleep();
    }    //添加猪的,调用猪的功能
    public static void feedDog(Dog d){
        d.eat();
        d.sleep();
    }

}/*测试类
  测试类里面不放其他东西(如,定义其他方法)!只能是建对象,调方法。
  所以新定义了个操作动物的工具类去放feedCat(),feedDog()方法。
*/class DuotaiTest{
    public static void main(String[] args){        //我喜欢猫,我养3只猫
        Cat c= new Cat();
        Cat c2= new Cat();
        Cat c3= new Cat();
        AnimalTool.feedCat(c);
        AnimalTool.feedCat(c2);
        AnimalTool.feedCat(c3);        //我喜欢狗,我养3只狗
        Dog d= new Dog();
        Dog d2= new Dog();
        Dog d3= new Dog();
        AnimalTool.feedDog(d);
        AnimalTool.feedDog(d2);
        AnimalTool.feesDog(d3);        //我喜欢宠物猪
        //需要定义一个猪类,它继承自动物类,提供两个方法。且在工具类里添加方法。

        //我喜欢宠物兔、老虎、狼.....
        //若按上述添加猪的办法做,定义类,继承类,提供方法都是必须要的。
        //但是在工具类里面改过来改过去,不好。能否做到不改?
        //能。
        //见DuotaiTest2.java 中工具类的写法


    }
}

改进后: 采用多态后,易于扩展。 重点在:用Fu f做形参接收参数,用Zi z的z做实参。有了父类引用指向子类。即动物类引用指向各具体的动物类。同时又有方法重写,运行的时候肯定是个各子类重写的方法在起作用。从而利用多态实现好的扩展性。

/*
    多态的扩展性
*//*
程序输出结果:
    狗吃肉
    狗坐着睡
    狗吃肉
    狗坐着睡
    狗吃肉
    狗坐着睡
    ---------------
    猫吃鱼
    猫趴着睡
    猫吃鱼
    猫趴着睡
    猫吃鱼
    猫趴着睡
    ---------------
    猪吃白菜
    猪躺着睡

*///父类:动物类class Animal{
    public void eat(){
        System.out.println("eat");
    }    public void sleep(){
        System.out.println("sleep");
    }
}//猫类class Cat extends Animal{
    public void eat(){
        System.out.println("狗吃肉");
    }    public void sleep(){
        System.out.println("狗坐着睡");
    }
}//狗类class Dog extends Animal{
    public void eat(){
        System.out.println("猫吃鱼");
    }    public void sleep(){
        System.out.println("猫趴着睡");
    }
}//添加猪类class Pig extends Animal{ //----------note:老忘记写extends!!!!!!!!!!
    public void eat(){
        System.out.println("猪吃白菜");
    }    public void sleep(){
        System.out.println("猪躺着睡");
    }
}//针对动物操作的工具类class AnimalTool{

    private AnimalTool(){}//最好把工具类的构造方法私有,防止别人创建该类的对象。该类是工具类。

    /*-------------改动-----------------------*/
    //注意:形参是Animal a,用动物接收。 到时候左边是 Fu f, 右边是Zi z, Fu f= Zi z 
    public static void feedAnimal(Animal a){  //工具类,方法就写成static的,然后直接在测试类:工具类名.方法 使用。
        a.eat();   //成员方法:运行看右边:各子类的。( 不然干嘛方法重写)
        a.sleep();
    }


}/*测试类
  测试类里面不放其他东西(如,定义其他方法)!只能是建对象,调方法。
  所以新定义了个操作动物的工具类去放feedCat(),feedDog()方法。
*/class DuotaiTest2{
    public static void main(String[] args){        //我喜欢猫,我养3只猫
        Cat c= new Cat();
        Cat c2= new Cat();
        Cat c3= new Cat();
        AnimalTool.feedAnimal(c);
        AnimalTool.feedAnimal(c2);
        AnimalTool.feedAnimal(c3);
        System.out.println("---------------");        //我喜欢狗,我养3只狗
        Dog d= new Dog();
        Dog d2= new Dog();
        Dog d3= new Dog();
        AnimalTool.feedAnimal(d);
        AnimalTool.feedAnimal(d2);
        AnimalTool.feedAnimal(d3);
        System.out.println("---------------");        //我喜欢宠物猪
        //需要定义一个猪类,它继承自动物类,提供两个方法。且在工具类里添加方法。

        //我喜欢宠物兔、老虎、狼.....
        //若按上述添加猪的办法做,定义类,继承类,提供方法都是必须要的。
        //但是在工具类里面改过来改过去,不好。能否做到不改?
        //能。
        //猫、狗、猪...都是动物,feedAnimal(Animal a)参数接收动物

        Pig p= new Pig();
        AnimalTool.feedAnimal(p);

    }
}

END

本文分享自微信公众号 - 程序员的成长之路(cxydczzl)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李蔚蓬的专栏

9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密

首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就...

10010
来自专栏xiaoheike

VS 2013 打包程序教程

如果你只是想要在他人的机子上运行你的程序而不想安装,有一种简单的方法,只要使用本教程的“步骤—3.生成Release 文件夹”即可。但是有一点需要注意,如果你在...

20120
来自专栏Android相关

AAC---Room使用

Room是AAC推荐的基于SQLite的ORM数据库框架。通过注解的方式来进行数据库的配置,以及SQL的查询,并且在编译的过程中,会检查SQL以及数据库配置等的...

14620
来自专栏木子墨的前端日常

linux服务器nginx的卸载和安装

刚接触的linux服务器上,nginx配置乱的有点令人发指,就把老的卸载了重新装一下。

1.1K30
来自专栏Android相关

Kotlin---协程的使用

在使用协程之前,需要保证Kotlin-Gradle-Plugin的版本高于1.3。目前最高的版本为1.3.11。否则编译会报错

18520
来自专栏武军超python专栏

2018年10月1日编译型语言和解释型语言的区别

计算机不能直接理解高级语言,只能直接理解机器语言(即计算机识别的二进制文件,因为不同的操作系统计算机识别的二进制文件是不同的,因为不同系统的指令用不同的二进制代...

12920
来自专栏WD学习记录

Java核心技术 卷I 基础知识 学习笔记(1)

简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释型、高性能、多线程、动态性。

15920
来自专栏一个爱瞎折腾的程序猿

asp.net mvc项目实记-开启伪静态-Bundle压缩css,js

js //定义自己的规则 var myXssOptions = function (isEditer) { retur...

9530
来自专栏谈补锅

iOS获取app图标和启动图片名字(AppIcon and LaunchImage's name)

  在某种场景下,可能我们需要获取app的图标名称和启动图片的名称。比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做个模拟通知提示,...

75420
来自专栏博客园

简析 .NET Core 构成体系

上图描述了 .NET Core的系统构成,最上层是应用层,是开发基于UI应用的框架集,包括了ASP.NET Core(用于创建web app),和 UWP(用于...

11020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励