利用实例巧妙区分“抽象方法”和“虚方法”!

简介:

 

抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。

目录

什么是抽象方法和虚方法?

抽象方法和虚方法的区别

举例分析方法的不同

抽象方法

虚方法


Hello!我是灰小猿!

最近在开发中,get到了虚方法这个名词,由于当时是在抽象类中用到,并且抽象方法和虚方法的使用有那么一丝丝的相近,之前也有了解过虚方法,但是对其概念比较模糊,所以今天在这里记录一下抽象方法和虚方法的区别。

什么是抽象方法和虚方法?

通俗上来讲,抽象方法是指定义在抽象类中的方法,需要在子类中被实现的方法。

而虚方法是指可以被子类覆盖的方法,或者说是可以被重写的方法。

抽象方法和虚方法的区别

抽象方法:只有方法名,没有方法体,方法名前用abstract关键字定义,必须在抽象类中声明,子类必须重写并实现父类中的抽象方法。

虚方法:有方法名和方法体,方法名前用virtual关键字定义,并不是必须在抽象类中声明,可以在任何非密封类中声明,但是当子类继承了父类后,存在于父类中的虚方法可以被重写,也可以不被重写。

关于抽象类的深入了解,小伙伴可以移步至我的这篇文章“抽象类到底抽不抽象?实例对比一看便知!

举例分析方法的不同

下面举个栗子说明一个抽象方法和虚方法的不同用途,以下代码使用C#语言编写,Java等语言思路类似。

抽象方法

比如说有一个基类“动物类”,同时有两个子类“鸟类”和“鸡类”。这两个类都有公共和特有的属性和方法。

如鸡和鸟都会叫,但是叫声不同,

鸡叫:咯咯咯

鸟叫:叽叽叽

我们就可以在基类“动物类”中定义一个约束“鸟类”和“鸡类”的抽象方法“叫声”。让这两个类分别实现该方法。

抽象方法的实现代码如下:

定义抽象类“动物类”实现抽象方法

//定义抽象类“动物类”
    abstract class Animal
    {
        //定义抽象方法“叫声”
        abstract public void cry();
    }

image.gif

定义“鸟类”,并且继承自“动物类”,实现“动物类”中的抽象方法。

//定义子类“鸟类”,并且继承自“动物类”
 class Fowl : Animal
    {
        //实现“动物类”中的抽象方法cry
        public override void cry()
        {
            Console.WriteLine("鸟叫:叽叽叽");
        }      
    }

image.gif

定义“鸡类”,并且继承自“动物类”,实现“动物类”中的抽象方法。

//定义“鸡类”,并且继承自“动物类”
    class Chicken : Animal
    {
        //实现“动物类”中的抽象方法cry
        public override void cry()
        {
            Console.WriteLine("鸡叫:咯咯咯");
        }
    }

image.gif

主类中分别调用“鸟类”和“鸡类”实现该叫声方法

class Program
    {
        static void Main(string[] args)
        {           
            //新建一个对象对“鸟类”实例化
            Fowl fowl = new Fowl();
            //新建一个对象对“鸡类”实例化
            Chicken chicken = new Chicken();
            fowl.cry();     //实现“鸟类”中叫声方法
            chicken.cry();  //实现“鸡类”中叫声方法
        }
    }

image.gif

运行结果:

image.gif编辑

虚方法

还有比如鸡和鸟都会飞,而且都是扇动翅膀飞行,但是鸟飞的很高,鸡飞的很低,这就是在飞行这个方法上,“鸡类”和“鸟类”既有公共特征也有不同特征,

那么就可以将飞行这个方法定义为虚方法,分别在“鸡类”和“鸟类”中重写该方法,但是会保留该方法中原有的公共特征“扇动翅膀”,添加自己特有的特征“飞行高度”。

虚方法的实现代码如下:

由于虚方法并不是必须在抽象类中声明,而是可以在任何非密封类中声明,所以将飞行这一动作声明在基类“动物类”中。

//定义基类“动物类”
    class Animal
    {
        //定义抽象方法“叫声”
        public void fly()
        {
            Console.WriteLine("扇动翅膀飞行");
        }
    }

image.gif

在“鸟类”中重写飞行方法,加入该类特有的特征:

//定义子类“鸟类”,并且继承自“动物类”
    class Fowl : Animal
    {
        //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
        public new void fly()
        {
            Console.WriteLine("扇动翅膀飞行");
            Console.WriteLine("鸟飞的很高");
        }    
    }

image.gif

在“鸡类”中重写飞行方法,加入该类特有的特征:

//定义“鸡类”,并且继承自“动物类”
    class Chicken : Animal
    {
        //重写“动物类”中的方法fly,并用bew关键字对基类中的fly方法进行隐藏
        public new void fly()
        {
            Console.WriteLine("扇动翅膀飞行");
            Console.WriteLine("鸡飞的很低");
        }
    }

image.gif

在主类中分别调用“鸟类”和“鸡类”实现该飞行方法:

class Program
    {
        static void Main(string[] args)
        {         
            //新建一个对象对“鸟类”实例化
            Fowl fowl = new Fowl();
            //新建一个对象对“鸡类”实例化
            Chicken chicken = new Chicken();
            fowl.fly();     //实现“鸟类”中飞行方法
            chicken.fly();  //实现“鸡类”中飞行方法
        }
    }

image.gif

运行结果:

image.gif编辑

觉得不错记得点赞关注哟!

大灰狼陪你一起进步!

image.gif编辑

目录
相关文章
|
SQL Oracle 关系型数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
850 0
|
监控 Java API
提升 Java 后台性能的十大方法
【4月更文挑战第5天】本文介绍了提升 Java 后台性能的十大方法,包括 JVM 参数调整、代码优化、并发编程、数据库性能优化、I/O 优化、微服务架构、API 设计、负载均衡、容器化和编排以及性能监控。通过这些方法,可以从代码到系统层面全面提升 Java 应用的效率和响应性。注意早期设计对性能的影响,持续优化是关键。
860 7
|
Oracle 关系型数据库 Java
解决读取Oracle数据库US7ASCII编码乱码问题
今天和第三方对接数据时,对方提供了一个视图US7ASCII编码,给代码调试带来了很大的不便。程序输出的mybatis获取的对象及new String(s.getBytes("ISO8859-1"), "GB2312")加解密后都是乱码。
2211 1
|
10月前
|
Java 程序员
菜鸟之路Day22一一反射与动态代理
本文介绍了Java反射机制和动态代理的基本概念及应用。反射允许编程访问类的成员变量、构造方法和成员方法,通过三种方式获取Class对象,并演示了如何使用反射创建对象、调用方法和修改字段值。动态代理则通过接口实现无侵入式功能增强,展示了如何利用`Proxy`类和`InvocationHandler`接口生成代理对象并拦截方法调用。结合实例代码,详细讲解了反射在实际开发中的应用场景,如保存对象信息到文件和根据配置文件动态创建对象。 反射的主要作用包括: 1. 获取类的所有信息。 2. 结合配置文件动态创建对象。 动态代理的核心优势在于能够在不修改原有代码的情况下,为对象添加额外功能。
194 0
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
868 0
|
SQL 前端开发
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(八)
基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(八)
636 0
|
数据采集 存储 分布式计算
超酷炫Python技术:交通数据的多维度分析
超酷炫Python技术:交通数据的多维度分析
|
Windows
【vscode】 VsCode终端崩溃C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe已终止,退出代码:2
【vscode】 VsCode终端崩溃C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe已终止,退出代码:2
3384 1
|
XML 中间件 数据库
基于jeecgboot的flowable流程支持定时边界事件
基于jeecgboot的flowable流程支持定时边界事件
479 0
|
XML JSON 前端开发
请假要组长和经理同时审批该怎么办?来看看工作流中的会签功能
请假要组长和经理同时审批该怎么办?来看看工作流中的会签功能