文章目录

1.静态成员、实例成员

2.静态类

3.类的静态成员和非静态成员区别

--------------------------------------分割线---------------------------------------------

1.静态成员、实例成员

1.1定义及说明

  数据成员:

静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.

实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.

  函数成员:
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量和静态方法;静态方法不可以直接访问实例变量和实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法;

实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。

静态方法和实例方法的访问权限表

静态成员变量
静态方法
实例成员变量
实例方法

静态方法
直接访问
直接访问
不可直接访问
不可直接访问

实例方法
直接访问
直接访问
直接访问
直接访问

总之:实例方法的存在必须要有对象实例的存在,如果对象实例不存在,则实例方法也就没有调用它的主人。静态方法的存在前提是类的存在,所以无需声明和New对象。

1.2代码演示 
class Program
{ static void Main(string[] args)
{
Class1.CallObjectFunc();//静态调用 Console.WriteLine(Environment.NewLine); Class1 tmpClass = new Class1();//实例调用
tmpClass.ObjectFunc(); Console.ReadKey();
}
} class Class1
{
static int Class_m = 9;//静态成员
private int object_m = 8;//实例成员 public static void CallObjectFunc()
{
Console.WriteLine("------------静态方法调用开始:"); Class1 class1 = new Class1();
class1.ObjectFunc();
Console.WriteLine("object_m:" + class1.object_m.ToString()); Console.WriteLine("------------静态方法调用结束:");
} public void ObjectFunc()
{
Console.WriteLine("实例方法调用开始:"); Console.WriteLine("Class_m:" + Class_m.ToString()); Console.WriteLine("实例方法调用结束:");
}
}

输出结果:

2.静态类

类可以声明为 static 的,以指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。

静态类的主要功能如下:

  • 它们仅包含静态成员。----函数成员和变量都必须有static修饰

  • 它们不能被实例化。

  • 它们是密封的。-----------编译器编译时自动生成sealed标记

  • 它们不能包含实例构造函数。

因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。

使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。

静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。

静态类:

static class CompanyInfo
{
public static string GetCompanyName() { return "CompanyName"; }
public static string GetCompanyAddress() { return "CompanyAddress"; }
}
3.类的静态成员和非静态成员区别
3.1区别

(1)语法区别:静态成员有关键字static,非静态成员无static修饰;

(2)存储区别:  静态成员变量存储位于程序的全局变量存储区,其作用域限制为类内部,并且在整个程序运行期间只在内存中拥有一个存储位置,不会拷贝不会复制,只是一个;

非静态成员变量存储位于对象的变量存储区,多个对象拥有多个变量的存储,只隶属于自己的的对象

(3)归属区别:静态成员隶属于类,是类的财产,无论对一个类创建多少个实例,它的静态成员都只有一个副本,在各个地方的改变都会改变其值;

非静态成员隶属于它的对象,各自对象同一个非静态成员值的改变都不互相影响,有多少实例就有多少副本;

(4)生存周期区别: 知道了存储位置的区别也就不难理解生存周期的差异了,静态成员只要分配了空间则在整个程序运行期间,它都是存在的,只有程序关闭之后,它的内存才会被GC回收器收回,不过作用域仍然只限制于类的内部,在类外部调用时需要使用类                                      名加点的方式访问;

类的非静态成员的生存周期跟随于隶属于对象的生存周期,对象消亡则非静态成员就会被回收;

(5)初始化顺序的区别:初始化都是最先初始化类的静态成员,然后才是非静态数据成员。

3.2代码:

下面代码的输出是多少呢?先自己思考

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; class class1
{
private static int i = getNum();
private static int num = 1; int j = getNum(); private static int getNum()
{
return num;
} static void Main(string[] args)
{
Console.WriteLine("i={0}", i); class1 class1Object = new class1();//默认构造函数
Console.WriteLine("j={0}", class1Object.j);
Console.WriteLine("i={0}", i); Console.ReadKey();
}
}

输出结果为:

额,怎么回事这样呢?是不是会和你想的不一样,如果你真有这种想法,说明还需要看我下面的分析噢

代码分析

类结构:这个类有三个变量,两个私有静态成员变量i和num,一个非静态成员变量j;一个私有静态函数getNum(),一个函数入口Main()

程序执行过程:首先之前说了初始化会首先初始化类的静态变量。

i分配空间并初始化值为0-->num分配空间并初始化为0-->i赋值(调用getNum函数,此时num为0,返回值为0,所以i=0)-->num赋值为1-->Main函数

至于Main函数内执行时,为什么i输出不是1呢?这是因为静态成员只初始化一次,所以此时调用i并不会再调用getNum()函数为其赋值,此时的调用i是获取i分配空间上的值。

【转载】https://www.cnblogs.com/Matcha/p/5312268.html

【转载】C#扫盲之:静态成员、静态方法、静态类、实例成员及区别的更多相关文章

  1. c# 静态成员和实例成员的区别

    静态成员也称为共享成员,例如静态属性 静态字段 静态方法:静态成员可以在类的实例之间共享. 静态类中只能有静态成员,不能有实例成员,因为静态类不能进行实例化: 在非静态类中 即可以有静态成员 也可以有 ...

  2. C++中类的静态成员与实例成员的区别

    C++中类的静态成员与实例成员的区别 1.有static修饰的成员变量或成员函数称为静态成员. 2.在内存中,类的静态数据成员占有一块特定的内存空间,被该类的所有实例(对象)共享.而同一个类的不同对象 ...

  3. C#扫盲之:静态成员、静态方法、静态类、实例成员及区别

    文章目录 1.静态成员.实例成员 2.静态类 3.类的静态成员和非静态成员区别 --------------------------------------分割线------------------- ...

  4. 【转】C#父类与子类的静态成员变量、实例成员变量、构造函数的执行顺序

    原文地址:http://www.xuebuyuan.com/1092603.html Win7+VS2010测试的结果如下: ①子类静态成员变量②子类静态构造函数③子类实例成员变量④父类静态成员变量⑤ ...

  5. DotNet中静态成员、静态类、静态构造方法和实例构造方法的区别与联系

    在面向对象的C#程序设计中,关于静态的概念一直是很多人搞不明白的.下面介绍这些带“静态”的名称. 1.静态成员: 定义:静态成员是用static关键字修饰的成员(包括字段属性和方法) 所属:静态成员是 ...

  6. 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类

    目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...

  7. Java SE之[静态成员/类成员]与[非静态成员/实例成员]【static】

    定义 静态成员:又称类成员,使用static修饰符的方法和变量: 非静态成员:又称实例成员,未使用static修饰符的方法和变量. 结论 注:jdk1.8 测试源码 public class Main ...

  8. JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链

    继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...

  9. .net学习之类与对象、new关键字、构造函数、常量和只读变量、枚举、结构、垃圾回收、静态成员、静态类等

    1.类与对象的关系类是对一类事务的统称,是抽象的,不能拿来直接使用,比如汽车,没有具体指哪一辆汽车对象是一个具体存在的,看的见,摸得着的,可以拿来直接使用,比如我家的那辆刚刚买的新汽车,就是具体的对象 ...

随机推荐

  1. POJ 2486 树形背包DP Apple Tree

    设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdi ...

  2. 推荐SQL Server Management Studio以及Visual Studio下的免费的插件 ApexSQL Complete

    SQL Server 并没有代码格式化的工具,对于处理他人编写的长SQL需要手工的格式化是一件麻烦的事情. 推荐SQL Server Management Studio以及Visual Studio下 ...

  3. Oc_总结

    1.定义类: @interface 类名 : 父类 @end 2.使用:(冒号)表示继承一个类 Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原 ...

  4. centos 7安装libreoffice

    centos 7安装libreoffice Centos下的LibreOffice安装: 关键字: LibreOffice , sdk ,汉化  ,解压 安装Centos7之后,系统安装了libreo ...

  5. Neural Networks and Deep Learning

    Neural Networks and Deep Learning This is the first course of the deep learning specialization at Co ...

  6. 用KMP征服循环节问题

    以前我还是写过KMP的文章的 现在我们可以求一下循环节啊 Slot Machines Gym - 101667I #include<bits/stdc++.h> using namespa ...

  7. POJ-2318 TOYS,暴力+叉积判断!

                                                                 TOYS 2页的提交记录终于搞明白了. 题意:一个盒子由n块挡板分成n+1块区 ...

  8. JSF框架整理

    JSP体系结构: JSF主要优势之一就是它既是Java web 应用程序的用户界面标准又是严格遵循 模型-视图-控制器(MVC)设计模式的框架. 用户界面代码(视图)和应用程序数据和逻辑(模型)的清晰 ...

  9. BZOJ 2693 jzptab ——莫比乌斯反演

    同BZOJ 2154 但是需要优化 $ans=\sum_{d<=n}d*\sum_{i<=\lfloor n/d \rfloor} i^2 *\mu(i)* Sum(\lfloor \fr ...

  10. HDU 1166 敌兵布阵【分块】

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...