C# 实例化的执行顺序
首先进行细分
1.类的成员分为:字段,属性,方法,构造函数
2.成员修饰符:静态成员,实例成员
不考虑继承的关系执行顺序为
1.静态字段
2.静态构造方法
3.实例字段
4.实例构造方法
其中 属性和方法只有在调用的时候才执行。
下面是一段代码例子
定义了一个类,当我们实例化的时候
Test test = new Test();
通过VS2008仿真 执行过程是
0. 静态的最先执行,仿真编译略过
1. F11 执行 public int mNum2=2; //简单的初始化字段
2. private int mNum3 = 3;
private int mNum4 = 4;
3. public Test() { temp = 1;mNum = 0; } //构造函数
以上是执行的顺序:与上面描述的的执行过程稳和,属性和字段跳过。public int mNum;也执行了,只不过系统默认赋值为空(null)或者0,系统西东除了的仿真时候跳过。
class Test{public static int temp;public int mNum;public int mNum2=2;public void look(){Console.WriteLine("看我,我是test");Console.WriteLine("mNum={0}", mNum);}private int mNum3 = 3;private int mNum4 = 4;public int Num3{get { return mNum3; }set { mNum3= value; }}public Test(){temp = 1;mNum = 0;}}
当存在继承关系的时候,执行的顺序。
1. 子类的静态字段
2. 子类的静态构造方法
3. 子类的实例字段
4. 父类的静态字段
5. 父类的静态构造方法
6. 父类的实例字段
7. 父类的实例构造方法
8. 子类的实例构造方法
下面是例子
1. 首先执行 class A中 int x = 1;,执行所有已经初始化后的字段,当执行到构造函数首执行父类字段
2. int sd = 6;
3. public A(),首先会去执行父类。
4. 0. 静态的最先执行,仿真编译略过1. F11 执行 public int mNum2=2; //简单的初始化字段2. private int mNum3 = 3;private int mNum4 = 4;3. public Test() { temp = 1;mNum = 0; } //构造函数
5. public A(){PrintFields();look();}// 执行子类中自己的构造函数
6. public virtual void PrintFields() ;执行自己类中有意义的虚函数
7. 执行调用父类的函数 look();
8. 接下来就将要执行 class B 中的内容了。过程类似,先一步一步的执行A类,在执行Test类,实现继承。
9. 忽略部分细节,降调B类中的细节。int z=2;public B() 运行到这里的时候,再次执行到 public A(){PrintFields();look();}的构造函数的时候,由于执行的是实例化B类,又在B类中重写了PrintFields();,实现多态。所以执行 public override void PrintFields(){Console.WriteLine("x={0},y={1}", "b", z);}所以此时的 z=2;而不是 public B(){z = -1;}中的z=-1,因为还没有执行到它,随后才执行子类中的构造函数。
10. 接下来是执行C类的实例化,C类中没有写C的构造函数,但是还是执行到了
B类(它的父类)中int z=2;,是因为,默认给写了无参的C类构造函数。
相当与 public C(){}
11. 所以任然能够继承,执行 public override void PrintFields()
{
Console.WriteLine(“j={0},k={1}”, “CC”, y);
}
class A :Test{int x = 1;public A(){PrintFields();look();}int c;int sd = 6;public virtual void PrintFields() {Console.WriteLine("j={0},k={1}", "AA", "AA");}}class B : A{int y;int z=2;public B(){z = -1;}public override void PrintFields(){Console.WriteLine("x={0},y={1}", "b", z);}}class C : B{int x = 1;int y = 3;public override void PrintFields(){Console.WriteLine("j={0},k={1}", "CC", y);}}
static void Main(string[] args){Test test = new Test();A a = new A();B b = new B();C c = new C();Console.ReadKey();}
补充说明
- 并不是每次实例化都是上面的顺序。因为静态的成员只是在第一次实例化的时候执行,以后再实例化都不会在执行。静态的成员意味着大家共享,且只有这一个。第一次实例化得到静态成员后,以后大家都共享,再次实例化,没有必要也不允许执行静态成员的部分。
- 在类中如果不添加访问修饰符,默认是静态的
- 非静态的字段,属性,方法,不能够作为右值。
- 构造引用类型的对象时,调用实例构造方法之前,为对象分配的内存总是先被归零,构造器没有显式重写字段,字段的值为0或者null,例如class Test 中的
public int mNum;mNum 默认为0 - C#编译器提供了简化语法,允许在变量定义的时候就进行初始化(C++应该不行,在构 造函数汇总)但是存在了代码膨胀的问题。多个字段在定义时初始化,同时存在多个构造方法,每个构造方法都会把这些字段初始化的代码搬到自己的内部,这样造成代码的膨胀。
- 为了避免这样情况,可以把这些字段的初始化放到一个无参构造方法内,其他的构造方法显式调用无参构造方法。
- 初始化字段的两种方法
①使用简化语法:在定义的时候初始化
② 在构造方法内初始化。
效果图
C# 实例化的执行顺序相关推荐
- Java继承关系的类的初始化和实例化的执行顺序
2019独角兽企业重金招聘Python工程师标准>>> 首先我们定义一个接口,如下: public interface People {String interfaceName = ...
- python实例化类执行顺序_Python实例化class的执行顺序
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python类中方法的执行顺序-Python中实例化class的执行顺序示例详解
前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...
- python类中方法的执行顺序-Python实例化class的执行顺序实例方法
Python中实例化class的执行顺序示例详解 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的 ...
- python实例化是什么意思_Python中实例化class的执行顺序示例详解
前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...
- pythonclass实例化_Python中实例化class的执行顺序示例详解
原博文 2020-01-12 22:04 − 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 ...
- java先执行static还是构造函数_【Java基础】类的实例化、static、父类构造函数执行顺序...
重温java基础,以免自己以后犯原则性错误,这是最基本,最基础的东西. 先看结论: 一个类的实例化过程: 1,首先会执行类中static代码块(不管代码块是否在类的开头还是末尾处),如果这个类有父类, ...
- Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
加载/执行顺序: 牢记一点: 静态和非静态分开处理 使用到静态加载时,静态又分为: 静态变量, 静态代码块, 其中加载顺序是按照类中书写的先后顺序加载的 非静态加载顺序: 按照非静态书写顺序加载/执行 ...
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一.静态成员变量(Static) * 1.静态成员变量为类变量,所有对象共享同一内存空间 * 2.静态 ...
最新文章
- WordPress数据库优化技巧
- key mysql_mysql中key 、primary key 、unique key 与index区别
- 图解c/c++多级指针与“多维”数组
- 在Android Studio中搜索整个项目中所有出现的字符串
- WinPhone 开发(1)-----在 XAML 页面之间浏览和数据的传递、保留以及恢复
- MyBatis的入门知识
- 第二阶段个人博客总结8
- Centos安装NFS服务器配置及挂载教程
- 【英语学习】【WOTD】yen 释义/词源/示例
- 报送数据标准校验java_Java:数据校验 - osc_gaqp1a2z的个人空间 - OSCHINA - 中文开源技术交流社区...
- 富文本框让最大四百像素_富文本框的使用
- 感谢大家对《软件性能测试与Loadrunner实战》的支持
- 机器学习入门——图解集成学习(附代码)
- ceph存储修改vm密钥(密码)
- python统计分析-卡方分析和方差分析
- C#模拟union接收
- 如何快速删除CSV、Excel、Markdown表格的重复行?
- 通讯录的思路与实现(C语言)
- C1. Simple Polygon Embedding(几何)
- 华硕rt-ac85p更换新驱动(一)