类静态和实例化执行顺序优先级(静态构造函数、静态变量、静态方法)
2015-11-16 14:59
309 查看
总结结果:
对于一个类执行顺序:
隐式静态变量初始化、静态函数初始化(隐式调用静态构造函数情况下,会在程序运行开头执行)>显式静态变量初始化、静态函数初始化(显式调用静态构造函数情况下,在使用类名时候就进行初始化操作)>静态构造函数执行>类实例化>变量初始化>函数初始化>构造函数初始化
总结:
对于静态调用和实例化调用,执行顺序“先静态域,后实例化域,先隐式,后显式”
对于变量、函数、构造函数执行顺序“先变量声明、再函数声明、最后构造函数”
调用演示
运行结果:
对于一个类执行顺序:
隐式静态变量初始化、静态函数初始化(隐式调用静态构造函数情况下,会在程序运行开头执行)>显式静态变量初始化、静态函数初始化(显式调用静态构造函数情况下,在使用类名时候就进行初始化操作)>静态构造函数执行>类实例化>变量初始化>函数初始化>构造函数初始化
总结:
对于静态调用和实例化调用,执行顺序“先静态域,后实例化域,先隐式,后显式”
对于变量、函数、构造函数执行顺序“先变量声明、再函数声明、最后构造函数”
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StaticClassDemo { class Program { static void Main(string[] args) { //StaticClassA 静态字段 //C#构造函数分为静态构造函数和实例构造函数。 //静态构造函数会在类的静态变量、方法等静态属性生成之后或者在new一个新的对象之前时被调用,隐式构造函数的类的静态变量、静态函数初始化会在程序开始之前执行 //实例构造函数在new一个新的对象时执行 //执行顺序:1.执行B类静态变量初始化生成(B类为隐式静态函数,B类的静态变量先初始化生成) Console.WriteLine("A EntryPoint"); //执行顺序:2.执行A类变量初始化生成(A该类为隐式静态函数,但A类的变量为非静态,所以在B类静态变量初始化之后,变量、函数调用之前生成),再执行A类实例化调用staticMem变量 Console.WriteLine(new StaticClassA().staticMem); //执行顺序:3.执行A类静态方法 StaticClassA.ShowStaticStr("Call A Static Method"); Console.WriteLine("************************************************************"); //执行顺序:4.执行B类静态字段调用显示(B类为隐式静态函数,在程序开始之前最先初始化了B类的静态变量) Console.WriteLine(" B EntryPoint"); Console.WriteLine(StaticClassB.staticMem); //执行顺序:5.执行B类静态方法 StaticClassB.ShowStaticStr("Call B Static Method"); Console.WriteLine("************************************************************"); Console.WriteLine("C EntryPoint"); //执行顺序:6.执行C类静态字段初始化显示(C类为显式静态函数,先初始化C类的静态变量,之后才调用C类的构造函数) //执行顺序:7.执行C类静态字段调用显示 Console.WriteLine(StaticClassC.staticMem); //执行顺序:8.执行C类静态函数调用 StaticClassC.ShowStaticStr("Call C Static Method"); Console.WriteLine("************************************************************"); //执行顺序:9.执行D类静态构造函数,因为D类实例化后才能调用非静态变量 Console.WriteLine("D EntryPoint"); //执行顺序:10.执行D类调用变量 Console.WriteLine(new StaticClassD().staticMem); //执行顺序:11.执行D类静态函数调用 StaticClassD.ShowStaticStr("Call D Static Method"); Console.WriteLine("************************************************************"); Console.WriteLine("E EntryPoint"); var e = new StaticClassE(); Console.WriteLine(e.Name); Console.WriteLine(StaticClassE.staticName); Console.WriteLine(e.ShowStr("Call E Method")); Console.WriteLine(StaticClassE.ShowStaticStr("Call E Static Method")); Console.Read(); } } }
调用演示
运行结果:
相关文章推荐
- !!代码:baidu 分享
- Android App集成支付宝
- Fiddler 真机抓包
- css文字过多以点点省略
- css文字过多以点点省略
- Cordova 非CLI的环境搭建(WIN+ANDROID)
- 项目管理有感之一 沟通
- 35个jQuery小技巧!
- icon-font与svg
- Java for LeetCode 226 Lowest Common Ancestor of a Binary Tree
- ORACLE查询所有序列
- 数据库多表连接查询详解
- ASP.NET 5 开发者的五个阶段-兄弟连IT教育
- 零散知识点杂烩
- 查看电脑是64位还是32位
- LeetCode:Compare Version Numbers
- [转]给心爱的Mac一个ssh-copy-id
- android studio 使用gradle 导出jar包,并打包assets目录
- 解决启动PyCharm,报错No Python interpreter selected
- 项目管理有感之二 需求调研