当前位置: 首页 > news >正文

C#中的编译时的类型与运行时的类型

如下代码所示:

class mm
    {
        public void F()
        {
            Console.WriteLine("mm.F()\n");
        }

        public virtual void G()       //声明了一个虚方法
        {
            Console.WriteLine("mm.G()");
        }
    }
    class nn : mm
    {
       new  public void F()        //隐藏了父类的F方法
        {
            Console.WriteLine("nn.F()\n");
        }

        public override void G()       //重写了方法G
        {
            Console.WriteLine("nn.G()");
        }
    }
    class Test
    {
        static void Main()
        {
           mm a = new mm();

            nn b = new nn();//实例化一个nn的对象b

            mm c = b; //把mm的对象c指向b

           Console.WriteLine("非虚方法");

            a.F();
            b.F();
            c.F();

            Console.WriteLine("虚方法");
            a.G();
            b.G();
            c.G();
            Console.ReadKey();
        }
    }

以上代码中的对象b没什么好说的,运行时与编译时类型均为nn

而对象c的运行时类型为nn,编译时类型为mm

说说原因,因为对象b,c本身都是引用类型,在编译时对象c的类型由我们写的mm c来确定,而在程序运行后发现c引用的内容实际是b所引用的内容,而对象b的类型是确定为nn的(因已实例化了),所以c的运行时类型就和b的类型相同了。

对于非虚方法来说,调用哪个方法取决于该实例编译时的类型

但对于虚方法来说,调用哪个方法取决于该实例运行时的类型

相关文章:

  • 1.Java集合-HashMap实现原理及源码分析
  • PHP中 rawurlencode() 将字符串编码成URL专用格式时与页面编码的关系
  • 衣食住行之我见
  • IMAP,POP3及Exchange协议讲解
  • error PRJ0003 : 生成“cmd.exe”时出错
  • 花式看超级碗 人工智能、大数据在碗里
  • CCNA学习笔记-EIGRP路由协议
  • 互联网金融监管框架该怎么构建
  • [转]为前端开发人员制作的 Chrome 扩展 jsbeautifier
  • CISO人事变动频发 何谓“幕后推手”?
  • 从初创到中国WAF的“小半壁江山”:RayWAF背后的故事
  • Windows Embedded Standard 7-让你体验一次不同凡响的嵌入式开发之旅
  • 白盒交换机:实现网络可编程性的三种方式
  • 第六课,Extjs中常用表单介绍与应用
  • JVM垃圾收集器
  • SegmentFault for Android 3.0 发布
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【前端学习】-粗谈选择器
  • 2017前端实习生面试总结
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Git同步原始仓库到Fork仓库中
  • Java反射-动态类加载和重新加载
  • Js基础——数据类型之Null和Undefined
  • js算法-归并排序(merge_sort)
  • js写一个简单的选项卡
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • js中的正则表达式入门
  • Spring声明式事务管理之一:五大属性分析
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 力扣(LeetCode)21
  • 区块链将重新定义世界
  • 使用 @font-face
  • 思否第一天
  • 算法系列——算法入门之递归分而治之思想的实现
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $.ajax()方法详解
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十一)手动添加用户和文件的特殊权限
  • (一)为什么要选择C++
  • (转)mysql使用Navicat 导出和导入数据库
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ./configure,make,make install的作用
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net 8.0 新的变化
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net分布式压力测试工具(Beetle.DT)
  • .Net接口调试与案例
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝