C#继承的执行顺序
自己对多态中构造函数、函数重载执行顺序和过程一直有些不理解,经过测试,对其中的运行顺序有了一定的了解,希望对初学者有些帮助。
eg1:
public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B : A
{
public B()
{
Console.WriteLine('B');
}
public void Fun()
{
Console.WriteLine("B.Fun()");
}
} class Program
{
static void Main(string[] args)
{
A a = new A();
a.Fun();
Console.ReadLine();
}
}
上述Main方法中在new A对象时,程序首先进入class A中,执行class A的构造函数A(),然后执行class A中的Fun()方法,故运行结果为:

eg2:
public class A
{
public A()
{
Console.WriteLine('A');
}
public void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B : A
{
public B()
{
Console.WriteLine('B');
}
public void Fun()
{
Console.WriteLine("B.Fun()");
}
} class Program
{
static void Main(string[] args)
{
B b = new B();
b.Fun();
Console.ReadLine();
}
}
上述Main方法中在new B对象时,由于B:A先执行父类的构造函数,所以先执行A中的构造函数A(),然后在执行B中的构造函数B(),故运行结果为:

eg3:
public class A
{
public A()
{
Console.WriteLine('A');
}
public void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B : A
{
public B()
{
Console.WriteLine('B');
}
public void Fun()
{
Console.WriteLine("B.Fun()");
}
} class Program
{
static void Main(string[] args)
{
/* B b = new A(); 错误
* A是父类,不能new一个父类对象指向子类,例:中国人是人类的对象,人类的对象不一定是中国人*/
A a = new B();
a.Fun();
Console.ReadLine();
}
}
上述Main方法中先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),最后调用class A的Fun()方法,故运行结果为:

eg4:
public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B : A
{
public B()
{
Console.WriteLine('B');
}
public override void Fun()
{
Console.WriteLine("B.Fun()");
}
} class Program
{
static void Main(string[] args)
{
A a = new B();
a.Fun();
Console.ReadLine();
}
}
上述Main方法同样是先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),但是子方法中使用了override关键字“覆盖”,使得子类中方法覆盖了父类中的方法,无法再访问父类中原始方法。(要重写方法,父类方法必须有virtual关键字),所以其运行结果为:

eg5:
public class A
{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
} public class B : A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
} class Program
{
static void Main(string[] args)
{
A a = new B();
a.Fun();
Console.ReadLine();
}
}
上述Main方法同样是先new B对象,先执行A中的构造函数A(),然后在执行B中的构造函数B(),但是子方法中使用了new关键字,由于其仍是a是A类型对象,所以仍然调用A中的方法,其运行结果如下:

1.B继承A,请问a是A的实例还是B的实例啊?
答:B的实例
2.对象a可以调用A类中的方法吗?可以调用B的方法吗?
答:不一定,如果是虚拟方法,并且在B类重载了A的虚拟方法,a将会调用B的同名方法,普通方法会调用A的方法
C#继承的执行顺序的更多相关文章
- java类与继承的执行顺序
1.子类 public class TestClassLife extends TestClassLifeSuper { public TestClassLife() { System.out.pri ...
- Java类中代码的执行顺序 静态代码块>构造代码块>构造方法
一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...
- 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解
在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...
- 【Java基础】继承中的代码块和构造方法的执行顺序探索
本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ stati ...
- Unity 继承MonoBehaviour脚本 执行顺序 详解
先看结果 Awake ->OnEnable-> Start ->-> FixedUpdate-> Update -> LateUpdate ->OnGUI ...
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...
- java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序
1:访问修饰符 private 同类中 默认 同类 同包 protect 同类 同包 子类 public 同类 ...
- odoo开发笔记 -- 多个子类继承同一个父类方法的执行顺序
场景描述: odoo模块化开发的架构理念,科学&高效, 可以让很多业务场景,尽可能松耦合:让开发人员的主要精力,关注在当前的业务逻辑: 所谓「前人栽树,后人乘凉」,模块整体好比一棵大树, 开发 ...
随机推荐
- ST-3- Installing and Testing IUnit, Hamcrest and Eclemma
一.安装JUnit和Hamcrest 1.首先从办公网上下载JUnit.jar和Hamcrest.jar,并且将其放入所进行的项目的bin目录下,我将其放入了triangle项目的bin目录下. 2. ...
- redis3.05安装
#yum -y install gcc #cd /usr/local/src #tar -zxvf redis-3.0.5.tar.gz #cd redis-3.05/ #make PREFIX=/u ...
- poj2513- Colored Sticks 字典树+欧拉通路判断
题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...
- 用CSS3实现饼状loading效果
原文地址:http://visugar.com/2017/05/17/CSS3%E9%A5%BC%E7%8A%B6loading%E6%95%88%E6%9E%9C/ 写在前面 (附录有源码及效果) ...
- 关于关系型数据库(MySQL)的一些概念
主键:关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录, 该属性组就可以成为一个主键,主键不允许为空,主键只能有同一个 外键:如果一个表的某个属性是另一个表的主 ...
- 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测)
文章由GIT博客迁移过来 程序下载地址(源码也在):点我下载 设计说明 10月20号晚上,准备写这么一个程序. 腾讯云万象优图每个账户提供50G的图片存储(支持黄图检测) 可以在截图之后,直接点击上传 ...
- Spring-web中的web.xml为Servlet提供的配置选项说明
配置Servlet时可以设置的一些初始化参数,总结如下: ContextAttribute: 在ServletContext的属性中,要用作WebApplicationContext的属性名称. Co ...
- 无锁atomicInteger
AtomicInteger可以保证硬件上的原子操作 1.主要原理 CAS操作 在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败, ...
- sql还原(.sql文件还原)
第一步: 把还原文件直接拖到SQL Server 2012(或者其他版本)里面,这里以MyDB.sql为例
- Maven基本安装与配置
百度Maven,进入Maven官网,点击Download 点击下载Binary zip包,下载到电脑上相应的位置即可. 找到下载文件,进行解压,解压到相应的文件夹下面,并且记住路径. 打开系统-> ...