C#基础知识整理:C#类和结构(3)
静态类和静态成员是指使用static关键字定义的类或成员,凡是static类的成员一定是static成员,不然会报错的。静态类和成员的一大特点就是它们是独一无二的。如果是static类,那么它是不能实例化的,而且加载在内存中只有一个;如果是static变量,方法,这个类可以被实例化的话,无论实例化多少次,static变量或方法始终只有一个。
如下:
(1)、静态成员
public class StatTicMember { public static string testA = string.Empty; } class Program { static void Main(string[] args) { //StaticConstruct strc = new StaticConstruct(); //StaticConstruct strcValue = new StaticConstruct(string.Empty); StatTicMember sMember1 = new StatTicMember(); StatTicMember.testA = @"静态成员"; Console.WriteLine(StatTicMember.testA); StatTicMember sMember2 = new StatTicMember(); Console.WriteLine(StatTicMember.testA); Console.ReadLine(); } }
结果:
静态成员特点:
a、必须通过类名引用,不能用类的对象来引用;
b、无论类被实例化多少次,在内存中只有同一块区域;
c、静态方法中如果引用方法外的变量或方法,它们也必须是静态的,如
public class StatTicMember { public static string testA = string.Empty; public string testB = string.Empty; public static void Method() { testA = @"my";//正确 //testB = @"my";//错误 } }
(2)、静态类
public static class StaticClass { public static string testA = string.Empty; public static void StaticMethod() { Console.WriteLine(@"静态方法"); } } class Program { static void Main(string[] args) { StaticClass.testA = @"静态类"; Console.WriteLine(StaticClass.testA); StaticClass.StaticMethod(); Console.ReadLine(); } }
结果:
静态类特点:
a、成员必须也是静态的;
b、不能别实例化,引用内部成员直接用类名;
c、是密封类;(注:密封类是指这个类不能用作基类,不能是抽象类,也就是不能派生。)
d、不能包含构造函数。
静态类和成员使用场合,静态类不能泛滥使用,因为它一旦加载了,就在内存中有一块区域,不论你用或不用,它都在那里。占用了内存。如下场合可以使用:
a、全局的变量,整个工程中都用到的一个变量,而且值不轻易改变,即使改变所有模块都必须要做出反应。
b、不操作实例数据,不与代码中特定类关联的方法,比如Math类中的一些方法。
2、密封类功能特性? 实现代码? 为什么要使用密封类?
密封类是指用sealed关键字修饰的一种类,它的目的是防止派生,也就是这种类不能被继承。
特点:
不能用作基类,不能抽象,密封类的调用比较快。
public sealed class SealedClass { public string testA = string.Empty; }
3、什么是抽象类? 功能特性? 实现代码? 接口与抽象类的区别?
抽象类是指用abstract关键字修饰的类。作用是派生多个类,共享基类的公用方法和属性。
public abstract class AbstractClass { public abstract void CommonMethod(); } public class ChildClass1 : AbstractClass { public override void CommonMethod() { Console.WriteLine(@"实现公用方法1"); } } public class ChildClass2 : AbstractClass { public override void CommonMethod() { Console.WriteLine(@"实现公用方法2"); } } class Program { static void Main(string[] args) { ChildClass1 chc1 = new ChildClass1(); chc1.CommonMethod(); ChildClass2 chc2 = new ChildClass2(); chc2.CommonMethod(); Console.ReadLine(); } }
结果:
抽象类和接口的区别:
a、类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类。而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做...”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中;
b、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
c、一个类一次可以实现若干个接口,但是只能扩展一个父类;
d、接口可以用于支持回调,而继承并不具备这个特点;
e、抽象类不能被密封;
f、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然也可以声明为虚的;
g、(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上;
h、抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的交给子类去实现;
i、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;
j、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
以上就是以上就是的内容,更多相关内容请关注PHP中文网(www.php.cn)!的内容,更多相关内容请关注PHP中文网(www.php.cn)!