static 静态修饰

static意思是静态,可以修饰类、字段、属性、方法


标记为static的就不用创建实例对象调用了,可以通过类名直接点出来

static三种用法:


1. 用于变量前

静态变量,可在全局访问.

表示每次重新使用该变量所在方法、类或自定义类时,变量的值为程序这次运行最后一次为变量赋值时的值,这个方法称为静态函数:

private void s()
{
    static int a=1;
    a++;
}


方法第一次调用结束后a在内存内值为2;
方法第二次调用结束后a在内存内值为3;


2. 在方法(函数)前

用static修饰,表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有,这个方法称为静态方法:
情况一:非静态方法

class t
{
    t(....(函数参数))
    {
        ~~~~(方法内容)
    }

    void s(....)
    {
        ~~~~
    }
}


当你在其他方法里调用这个类中的方法s,则需先声明这个类的变量如:t sd = new t(....);
再在t里调用方法:sd.s(....);


情况2静态方法

class t
{
    t(....(函数参数))
    {
        ~~~~(方法内容)
    }

    static void s(....)
    {
        ~~~~
    }
}


当你在其他方法里调用这个类中的方法s,则不用先声明这个类的变量如直接调用方法:t.s(....);


3. 用于类class前

    说明此类型无法新建实例(不能 new)。

    静态类与非静态类的区别在于不能被实例化,就是不能使用new。
    举个例子:
   

    一个公司(类),里面有很多个员工(new 的实例的成员) ,
    每个员工都有自己的电脑(成员变量),公司有食堂(static)。

    使用时必须指出 所有者 例如 “职员A.电脑” 表示 职员A的电脑,

    对于食堂(static)而言,他是属于整个公司的,而不是属于特定的某个实例 ,
    使用时只能表示为 公司.食堂。


    这个类型的方法全是静态方法,这个类里的非静态方法是不能使用的,这个类型称为静态类.
    比如C#控制台操作的Cancle类里面的成员就被标记为静态的,可以直接用Concle.直接点出来使用。
    如果没有标记为静态就要通过创建实例对象来调用,比如说动态字符串StringBuilder就要new一个实例来调用

StringBuilder sb =new StringBuilder();
sb.xxx(); //xxx是方法名

static class t
{
    ~~~~
}

class d
{
    ~~~~
    void f(....)
    {
    ~~~~
    t v = new t();//此时程序会出现错误
}

变量声明成static的话当整个程序退出时才释放空间
还有就是静态是类所有,非静态是对象所有
比如

class A
{
    public static void Fun1(){};
    public void Fun2(){};
}


使用Fun1的话就直接A.Fun1()就可以了,如果实用Fun2的话必须实例一个对象出来才行


1.在static void Main(string[] args)里用到的所有不在函数域里的变量都需要设置成static
2.有的类中将变量(即定义一个“域”)或者方法定义为static类型,那么这个变量字段(或者方法)可以形象的理解为是“类”的(即,该类的所有成员共享内存中为a分配的一块内存空间),而不像其他普通的变量(或者方法)一样是属于“对象(即类的实例)”的,当然这只是形象的说法
例:

class A
{
    static int a=0;

    static void Str()
   
    public A(int x)
    {
        a=x;
    }
}
 


那么在程序运行的过程中,变量a只被“初始化”一次,即只在创建第一个类A的对象是初始化a,比如创建A的实例b,并赋予a的值为3;此后再创建A的实例,如c并使用如下方式 A c(4);该语句的意思是创建A的实例,并调用构造函数,将4赋予a,则此时对象c中的域a的值为4,而对象b中的域a的值也为4(注意:不再是3),因为“类的静态域(字段)是其所有对象共享的,亦即只有一个,也就是不属于对象,而是类自身的(可以这么理解,其实我也不知道准不准确)”。
至于静态的方法,其实也是类的,使用时直接用“类名.方法名”的形式,而不是像普通的方法那样用“对象名.方法名”的形式....

发布了85 篇原创文章 · 获赞 30 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/104396836