静态类、静态方法、静态成员和实例成员的比较
2018-01-29 01:14
92 查看
任何项目中都会使用到静态类、静态方法、静态成员和实例成员了。那么这几个名词到底有哪些区别呢?
1、静态成员和实例成员
静态成员:静态成员通常和类是相关联的。它可以作为类中公有的变量,不依赖特定对象的存在。通常我们在访问它们的时候很简单,直接通过类名加点操作符再加变量名来进行操作。
实例成员:实例成员通过和对象是相关联的。一般情况下,我们都是对类的实例化来进行访问操作。如果实例不存在,那么也就无法访问实例成员对象。
所以实例成员的存在必须要有对象实例的存在,如果对象实例都不存在了,那么就将无法访问;而静态成员只是依赖于类的存在与否,也就无需声明和实例化对象了。
如下方这段示例:
class Program { static void Main(string[] args) { MyStaticText.MyStaticMethod(); //静态方法调用 MyStaticText myStaticText = new MyStaticText(); myStaticText.MyExampleMethod(); //实例方法调用 Console.ReadKey(); } } class MyStaticText { private int exampleInt = 5; private static int staticInt = 6; public static void MyStaticMethod() { Console.WriteLine("开始调用静态方法:"); MyStaticText myStaticText = new MyStaticText(); myStaticText.MyExampleMethod(); Console.WriteLine(staticInt); Console.WriteLine("结束调用静态方法:"); } public void MyExampleMethod() { Console.WriteLine(exampleInt); } } static class MyStaticClassText { public static int GetStuNo() { return 1; } public static string GetStuName() { return "Jim"; } }
最后的输出结果为:
2、静态类
我们知道,对于类有很多修饰符,如
public,同时,类也可以声明为
static,表示它仅可以包含静态成员。不能实例化来创造类的实例。比方说,在有些特定业务中,不需要操作实例数据也不与代码中特定对象关联。那么此时,就需要使用静态类来包含特定的方法。
静态类的主要功能如下:
- 类中仅包含静态成员和静态方法。并且必须被
static
修饰。 - 它们不能被实例化。
- 它们是密封的。那么此时编译器编译时会自动生成
sealed
标记。
项目中使用静态类的优点在于,对于静态类的创建,编译器能够执行检查以确保不会偶然的添加实例成员。同时,静态类时密封的,因此也不允许被继承。
如下方代码示例:
static class MyStaticClassText { public static int GetStuNo() { return 1; } public static string GetStuName() { return "Jim"; } }
3、类的静态成员和非静态成员
对于一个类中的静态成员和非静态成员到底有哪些区别呢?
- 语法区别:静态成员需要
static
关键字修饰,而非静态成员可以不需要。 - 存储区别:对于静态成员而言,它是存储在程序中全局变量存储区中,并且在整个程序运行期间只在内存中有一个位置,既不会拷贝也不会复制。
- 归属区别:静态成员属于类的成员变量,无论对一个类实例化多少次,这个类的静态成员都只有一个副本,程序中各个地方对它的调用都会改变它的值;而非静态成员属于他的对象,各自对象对自身实例的改变不会各自影响。
- 初始化顺序的区别:初始化时首先初始化类的静态成员,然后才是非静态成员。
根据上述内容,下面示例代码的输出是多少呢?
class Program { private static int i = GetNum(); private static int num = 10; int j = GetNum(); private static int GetNum() { return num; } static void Main(string[] args) { Console.WriteLine("i={0}", i); Program program = new Program(); Console.WriteLine("j={0}", program.j); Console.WriteLine("i={0}", i); Console.ReadKey(); } }
输出结果为:
以上就是对静态方法、静态成员、静态类和实例成员的比较。有不对的地方请大家指正或者一起交流。
相关文章推荐
- C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
- 【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别
- 静态成员、静态方法、静态类、实例成员及区别
- 实例成员变量不能在静态方法中访问
- Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象,
- .NET(C#)中静态方法或实例方法中调用静态成员或者实例成员,有几种情况?
- java静态方法不能访问实例成员的分析
- 静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。
- C# 静态成员 静态方法 静态类
- Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象,
- Java如何在静态方法中访问类的实例成员(没附加static关键字的字段或方法)
- Objective-C 类,实例成员,静态变量,对象方法,类方法(静态方法),对象
- 关于静态变量,成员变量,静态方法,实例方法的用法及区别
- 如何在静态方法中访问类的实例成员
- 5.Static ,protect,属性和方法,静态方法(static)和实例方法,JAVA的静态变量、静态方法、静态类
- 在静态方法中实例化非静态类内部类时报错
- 静态构造函数 。。静态类中成员必须全是静态的。不能在静态类中声明实例成员
- 静态成员-静态方法-静态类
- 关于类方法里不能调用实例方法/成员变量(即静态方法里不能调用非静态方法和成员变量)的论述
- java中 静态成员、实例成员、构造方法在子类和父类中的执行顺序