虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项。抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化。

//抽象方法
publicabstractclass Animal
{
    publicabstractvoid Sleep();
    publicabstractvoid Eat();
}

//虚方法
publicclass Animal
{
    publicvirtualvoid Sleep(){}
    publicvirtualvoid Eat(){}
}

2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写。虚方法不是也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。

publicclass Animal
{
    publicabstractvoid Sleep();
    publicabstractvoid Eat();
}

这样写编译器会报错。

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必。抽象方法不能声明方法体,而虚拟方法可以。 包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!

publicabstractclass Animal
{
    publicabstractvoid Sleep();
    publicabstractvoid Eat();
}

publicclass Cat : Animal
{
    publicoverridevoid Sleep()
     {
         Console.WriteLine( "Cat is sleeping" );
     }
    // we need implement Animal.Eat() here
}

编译器会报错,因为我们没有实现抽象类中所有抽象方法。

虚拟方法和抽象方法有什么区别与联系:

1、抽象方法只有声明没有实现代码,需要在子类中实现;虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现。

2、抽象类不能被实例化(不可以new),只能实例化实现了全部抽象方法的派生类;而包含虚方法的类可以实例化。

3、虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。

4、抽象方法是虚拟方法两个相像的一点是都用override重写。

转载于:https://www.cnblogs.com/tanding/archive/2012/06/27/2565268.html

C#类、接口、虚方法和抽象方法-虚拟方法与抽象方法之区别相关推荐

  1. java 虚类_java虚方法

    java虚方法 我们已经讨论了方法的重载,也就是子类能够重载父类的方法.以下是小编为大家搜索整理的java虚方法,欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网! 当子类对象调用重载的方法时 ...

  2. const与readonly,析构函数,虚拟方法

    const 与readonly    const 关键字用于修改字段或局部变量的声明.它指定字段或局部变量的值不能被修改.常数声明引入给定类型的一个或多个常数.     常数声明可以声明多个常数,例如 ...

  3. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof

    面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...

  4. 虚拟方法及抽象方法在使用上的区别

    虚拟方法,由virtual声明,它允许在派生类中重写,也可以不重写.如果在派生类中重写时要声明override.  1   public   class   myclass    2   {    3 ...

  5. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  6. [C++] - 纯虚函数 抽象基类 接口类

    翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...

  7. LindAgile~缓存拦截器支持类的虚方法了

    写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...

  8. 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法

    /*1)编写Animal接口,接口中声明run()方法:   2)定义Bird类和Fish类实现Animal接口:   3)编写Bird类和Fish类的测试程序,并调用其中的run()方法 */ in ...

  9. Java 8 函数式接口就是一个有且仅有一个(除和Object中方法有相同签名的外)抽象方法

    函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. 昨天突然在看java8源码时候 ...

最新文章

  1. Linux / OpenWRT / 目录功能说明
  2. Java字符字符串类
  3. 蓝桥杯比赛的RTC时钟配置
  4. “Jupyter的杀手”:Netflix发布新开发工具Polynot
  5. iOS:using Segue in Popover
  6. php开启filtervar_PHP如何使用filter_var()函数?(代码示例)
  7. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号
  8. mysql 循环查询_mysql循环查询(mysql循环语句)
  9. 12位中年程序员:代码一敲十年,收入虽高前途摇摆
  10. MM-Wiki部署方案
  11. 加尔布雷思:人类永恒的愚蠢,就是把莫名其妙的担忧当成智力超群。
  12. 聊聊Hive数据血缘——从Atlas没有列级血缘的Bug讲起
  13. .Net 微信支付集成
  14. Mathorcup数学建模竞赛第六届-【妈妈杯】A题:基于模糊综合评价和灰色关联度的淡水养殖池塘水华分析、预测及净化模型(附一等奖获奖论文和matlab代码)
  15. kong mysql_konga 安装
  16. QQ空间视频下载详细教程(手机端)
  17. office2016激活後显示是激活的状态,打开后还是提示激活:“让我们开始”
  18. JAVA 网络编程流相关代码(UDP和TCP)
  19. 直流通路下共射、共集、共基放大电路分析
  20. 谷歌老闪退啊 和 pycharm版本问题 and 微信闪退

热门文章

  1. 计算机前端专业术语,学习计算机知识必须懂得50个专业术语
  2. linux 中samba账号登录密码,ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录...
  3. php操作mysql数据库,PHP操作mysql数据库
  4. boyer moore算法 java_Boyer-Moore算法
  5. C++中创建二维数组的几种方法
  6. java模拟器未载入,由于“活页夹线程池”,应用程序未在模拟器上运行
  7. C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)
  8. matlab创建mat格式变量并导入数据
  9. 本质矩阵与基本矩阵(对极几何)
  10. MFC中“资源在另一个编译器中打开”报错解决方法