起因
问:静态类可以实现接口及继承?
答:都不可以
思考:为什么不可以呢?
学习
静态类,有时我们又称为工具类(密封抽象类),从MSDN文档没有直接静态类的定义,这里只能说用static(不能用于结构,只能用于类)关键字声明的类,就是静态类。
静态类与非静态类的区别:静态类不能实例化,就是不能通过使用 new 关键字创建静态类类型的变量。通过类名本身访问自身成员;
特性:1、仅包含静态成员(字段、方法、属性、事件)
2、无法实例化
3、是密封的
4、不能包含实例构造函数
定义静态类及其使用
//定义静态类和静态方法,未定义静态字段、属性、事件 public static class CommonHelper { public static void PrintContent() { Console.WriteLine("Static Class"); } }CommonHelper.PrintContent(); //调用静态类的静态方法
静态类加载时机:和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。
静态类的本质
通过静态类的的特性,就可以回答
1、静态类为可以实现接口?不可以,因为静态类无法实例化(只有类的实例才可以调用类中的接口方法)
2、静态类可以被继承吗?不可以,因为静态类是密封的
这样来回答比较笼统,也不具有说服力哈,通过生成的IL就能清楚知道为什么了!
.class public abstract auto ansi sealed beforefieldinit CommonHelper extends [mscorlib]System.Object //通过abstract关键字 不能实例化 //通过sealed关键字 不能让其他类继承 { .method public hidebysig static void PrintContent() cil managed { .maxstack 8 L_0000: ldstr "Static Class" L_0005: call void [mscorlib]System.Console::WriteLine(string) L_000a: ret } }
静态类、静态成员所分配的内存在程序结束时,才能被释放