`

C#中基类和派生类的构造函数以及变量的执行顺序整理

c# 
阅读更多

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 class Program
{
static void Main(string[] args)
{
B b = new B();
Console.WriteLine(A.s_a);
Console.WriteLine(B.s_b);
Console.WriteLine(b.g_a);
Console.WriteLine(b.g_a_1);
Console.WriteLine(b.g_b);
}
}
//基类
class A
{
//静态变量
public static string s_a = "A.s_a" + (C.index++).ToString("_00");
//变量
public string g_a = "A.g_a" + (C.index).ToString("_00");
//为了显示A.g_a
public string g_a_1 = "A.g_a_1" + (C.index++).ToString("_00");

//静态构造函数
static A()
{
Console.WriteLine("It is in static A()" + (C.index++).ToString("_00"));
}
//构造函数
public A()
{
Console.WriteLine("It is in A()" + (C.index++).ToString("_00"));
this.M();
}
//虚方法
public virtual void M()
{
Console.WriteLine("It is in A.M()" + (C.index++).ToString("_00"));
}
}

//派生类
class B : A
{
//静态变量
public static string s_b = "B.s_b" + (C.index++).ToString("_00");
//变量
public string g_b = "B.g_b" + (C.index++).ToString("_00");

//静态构造函数
static B()
{
Console.WriteLine("It is in static B()" + (C.index++).ToString("_00"));
}
//构造函数
public B()
: base()
{
Console.WriteLine("It is in B()" + (C.index++).ToString("_00"));
g_a += "->B.g_a" + (C.index++).ToString("_00");
this.M();
}
//重写方法
public override void M()
{
Console.WriteLine("It is in B.M()" + (C.index++).ToString("_00"));
Console.WriteLine("B.g_a=" + g_a + (C.index++).ToString("_00"));
}
}
class C
{
public static int index = 1;
}

 

代码中使用了另一个类的静态int型变量记录下各个部分的执行顺序。
  运行结果是:

 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->It is in static B()_02
It is in static A()_05
It is in A()_07
It is in B.M()_08
B.g_a=A.g_a_06_09
It is in B()_10
It is in B.M()_12
B.g_a=A.g_a_06->B.g_a_11_13
A.s_a_04
B.s_b_01
A.g_a_06->B.g_a_11
A.g_a_1_06
B.g_b_03

 

整理下后得到:

 

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->B.s_b_01
It is in static B()_02
B.g_b_03
A.s_a_04
It is in static A()_05
A.g_a_1_06
It is in A()_07
It is in B.M()_08
B.g_a=A.g_a_06_09
It is in B()_10
A.g_a_06->B.g_a_11
It is in B.M()_12
B.g_a=A.g_a_06->B.g_a_11_13

 

 结论
  当实例化一个子类时,父类以及子类的变量和构造函数的执行顺序如下:
01子类的静态变量->02子类的静态构造函数->03子类的变量->04父类的静态变量(此时因为要执行子类的构造函数,会与父类发生关系)
->05父类静态构造函数->06父类变量->07父类构造函数->10子类构造函数->结束

  在试验过程里面添加了几个步骤主要说明子类重写父类方法的调用情况:
1)在父类的构造函数中调用(步骤08),此时调用子类的实现时,其中的变量g_a的值还是来自于父类(步骤09)。
2)在调用子类的构造函数后,变量g_a的值被重新设置(步骤11),此时调用子类的实现时,变量值是子类构造函数中设定的。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C#之用Base方法调用基类构造函数学习案例 c#经典案例.pdf

    通过这个案例,我们将了解C#中基类和派生类的关系,以及如何使用Base方法调用基类的构造函数。 首先,我们需要了解什么是基类和派生类。在面向对象编程中,基类是指一个通用的类,而派生类是指从基类继承的类。基类...

    C++中基类和派生类之间的转换实例教程

    总结起来,C++中基类和派生类之间的转换是面向对象编程的关键特性,它允许我们利用继承的层次结构来设计更灵活的代码。理解这些转换规则以及何时使用虚函数和类型转换运算符是编写高质量C++代码的基础。在实际编程中...

    C++阶段真题及答案.pdf

    15. 构造函数的调用顺序是先基类构造函数,然后是派生类构造函数。如果派生类构造函数没有显式调用基类构造函数,编译器将尝试调用基类的默认构造函数。 16. 抽象类是不能实例化的类,它可能包含抽象方法(没有定义...

    插值基函数

    构造出一类新的HERMITE插值基函数,

    中基国威:2019年半年度报告.PDF

    报告中的财务数据和指标摘要、管理层的讨论与分析以及财务报告部分,提供了深入洞察公司的经营业绩、财务健康状况和战略方向。然而,由于提供的内容有限,具体的数据和分析未能在此详细展开。完整报告将包含更详尽的...

    世联_浙江中基置业青山湖项目整体定位及发展报告_228PPT.pptx

    报告概述了浙江中基置业青山湖项目的整体定位和发展策略,主要关注其作为高端豪宅的建设。报告强调了几个关键优势,这些优势构成了项目的核心价值体系。 1. **稀缺资源**:项目占据青山湖畔,拥有丰富的山水资源和...

    企业-ST中基-2020年年终总结.rar

    【标题】:“企业-ST中基-2020年年终总结.rar”是一个压缩文件,通常包含了一家名为“ST中基”的企业在2020年度的工作总结报告。这样的文件是企业内部管理和信息共享的重要载体,它反映了公司在过去一年的运营状况、...

    中基重点问题.pages

    中基重点问题.pages

    浙江中基建设工程管理有限公司

    用户和密码都是 admin 公司企业网站自助建站管理系统正式版,是公司企业建网站之首选。经典漂亮的适合公司企业的版面。强大的网站后台管理系统,只要会打字,就可随时管理网站内容!就可轻松拥有一个属于自己的...

    中医执业医师考试中基50题.pdf

    综上所述,中医执业医师考试中涉及的知识点包括:阴阳五行理论、整体观念、辨证论治、脏腑阴阳属性、疾病的发展转化以及精神心理与脏腑的关系。理解并掌握这些基本概念,对于中医临床实践和理论研究至关重要。

    2021年中医执业医师考试针灸中基高频考点.pdf

    《2021年中医执业医师考试针灸中基高频考点》主要涵盖了中医执业医师资格考试中的重要知识点,尤其在针灸和中医基础理论方面。以下是这些知识点的详细解析: 1. 十二经脉交接部位:脾经与心经在心中交接,肝经与肺...

    中基试题及答案.docx

    根据提供的文档内容,我们可以从中提炼出以下几个重要的知识点: ...综上所述,中基试题涵盖了中医学的基本概念、理论体系、治疗原则等多个方面,通过对这些知识点的掌握,可以更好地理解和应用中医学知识。

    中医执业医师考试中基50题.doc

    中医执业医师考试中基50题.doc

    1_中基作业--王迎澳.odt

    1_中基作业--王迎澳.odt

    关于B-样条插值及紧支撑样条小波插值的一个注记

    在本文中,徐应祥探讨了在B-样条函数插值与紧支撑样条小波函数插值过程中基函数的选择问题,指出这一步骤对于插值函数的成功构建至关重要。文章首先介绍了B-样条函数以及它们作为基函数所具备的优点,例如系数矩阵的...

    松辽盆地深层岩性(火山岩)分类方案

    4. 火山岩分类方案中涉及的具体岩类:分类方案中明确了各类火山岩的特点,如珍珠岩、黑耀岩和松脂岩等玻璃质熔岩多为酸性,而中基性种类也常见。同时,隐爆角砾岩和具熔结结构的岩石属于火山碎屑熔岩类。 5. 火山岩...

    fft.rar_Dsp中基2fft算法_dsp FFT_fft_fft DSP _fft base 2 algorithm

    3. **位反序**:在基2 FFT中,由于分解和组合的过程涉及到不同的频率顺序,因此在计算过程中需要对输入序列进行位反序,使得低频成分在前,高频成分在后,以便正确地执行蝶形运算。 4. **递归结构与分治策略**:基2...

    中基.碧域钢筋工程施工组织设计方案.doc

    中基.碧域钢筋工程施工组织设计方案.doc

Global site tag (gtag.js) - Google Analytics