精华内容
下载资源
问答
  • static静态变量

    2018-08-01 22:21:47
    static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。 静态方法: static 关键字用来声明独立...

     

    static 修饰符

    • 静态变量:

      static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

    • 静态方法:

      static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

    简单来说就是:类变量改变,所有此类对象对应的此类变量都同步改变,

    public class HelloWord {
    	private static int m = 1;
    	public int add() {
    		return ++m;
    	}
    
     	public static void main(String ags[]) { 
     		HelloWord demo1 = new HelloWord();
     		HelloWord demo2 = new HelloWord();
    
     		System.out.println(demo1.m);        // 1
     		System.out.println(demo1.add());    // 2
     		System.out.println(demo2.m);        // 1
    }
    }

     

    展开全文
  • static 静态变量

    千次阅读 2007-06-19 17:28:00
    当在函数体(或复合语句)内部用“static”关键字来定义一个变量时,称该变量为静态局部变量(不能简称为静态变量,因为还有静态全局变量)。静态局部变量的作用域与自动变量和寄存器变量一样,但它与前者有两点本质...

               当在函数体(或复合语句)内部用“static”关键字来定义一个变量时,称该变量为静态局部变量(不能简称为静态变量,因为还有静态全局变量)。静态局部变量的作用域与自动变量和寄存器变量一样,但它与前者有两点本质上的区别:

            1)在整个程序运行期间,静态局部变量在内存的静态存储区中占据着永久性的存储单元。即使退出函数以后,下次再进入该函数时,静态局部变量仍使用原来的存储单元。由于并不释放这些存储单元,因此这些存储单元中的值得以保留。从而可以继续使用存储单元中原来的值。由此可见,静态局部变量的生存期一直延长到程序运行结束。

          2)静态局部变量的初值是在编译时赋给的,在程序执行期间不再赋初值。对未赋初值的的静态局部变量,C编译系统自动给它赋初值0.

          当用“static”关键字定义全局变量时,该变量称为静态全局变量。静态全局变量只限于当前源文件中使用,不能被其他源文件中的函数所引用。

    展开全文
  • static静态变量的理解

    千次阅读 2018-07-22 17:26:37
    static静态变量的理解 静态变量 类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存
    原文地址为:static静态变量的理解

    static静态变量的理解

    静态变量 类型说明符是static。

    静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。

    另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

    所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。

    静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。

    静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。



    一、静态局部变量:

    1、Static类内部变量同auto自动变量(即未加 Static声明的局部变量)一样,是某个特定函数的局部变量,即只能在定义该变量的函数内使用该变量,2者作用域相同;两者的不同在于:auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会,它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量。

    2、函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作(出现在函数内部的基本类型的的静态变量初始化语句只有在第一次调用才执行)。而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    3、静态局部变量的初始化表达式必须是一个常量或者常量表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。而对自动变量auto来说,如果不赋初值则它的值将是个不确定的值。

    4、当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

    注:局部静态变量占用内存时间较长,并且可读性差,因此,除非必要,尽量避免使用局部静态变量。

    example:

    //考察静态局部变量的值。







    #

    include

    <

    stdio.

    h>





    int

    f(

    int

    a)



    {



        auto

    b =

    0;



        static

    c =

    3;





        b =

    b +

    1;



        c =

    c+

    1;



        return

    (

    a+

    b+

    c)

    ;



    }





    main(

    )



    {



        int

    a =

    2,

    i;





        for

    (

    i =

    0;

    i <

    3;

    i +

    +

    )



            printf

    (

    "%d\n"

    ,

    f(

    a)

    )

    ;



    }



    //求1~5的阶乘。





    /*

    由于f为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。若变量f说明为自动变量(去掉static),当main中多次调用factor时,f均赋初




    值为1,故每次输出值均为1。
    */

    #include <stdio.h>

    long factor(int n)
    {
        static long int f = 1;//static
        f *= n;
        return f;
    }

    main()
    {
        int i;
        for (i = 1; i <= 5; i++)
            printf("%ld\n", factor(i));
    }



    二、静态全局变量

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
    全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
    这两者在存储方式上并无不同。
       
    这两者的区别虽在于:
    1、非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
    2、静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件(即声明了该变量的CPP文件,或包含该变量声明头文件的CPP文件)中不能使用它。
       
    由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
       
    从以上分析可以看出————
    把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
    把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

    因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。

    关于Static关键字
    1.静态变量,分配在静态存储区,在数据段中。函数退出之后,变量值不变。
    2.作用域,全局的静态变量、静态函数只能在本文件中使用。(不同于一般全局变量)
    局部的静态变量同函数的局部变量


    五大内存分区(貌似与编译原理中不一样,不过道理是一样的,实际存在的东西总是会与理论有一定差距的)
    1.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
    2.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
    3.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
    4.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
    5.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
    6.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)



    另外:

    1)、static静态变量会被放在程序的全局存储区中(即在程序的全局数据区,而不是在堆栈中分配,所以不会导致堆栈溢出),这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

    2)、static静态变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。——有信息隐蔽的作用。(外部的Static声明亦可用于声明函数。如果将函数声明为Static类型,则该函数名除了对该函数声明所在的文件可见外,其他文件均无法访问。

    3)、若全局变量仅在单个C文件中访问,则可将此变量改为静态全局变量,以降低模块间的耦合度;
    若全局变量仅由单个函数访问,则可将此变量改为该函数的静态局部变量,以降低模块间的耦合度。



    4)、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。
        所谓"可重入"(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。
       
        函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。

        如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

     当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

     


    转载请注明本文地址:static静态变量的理解
    展开全文
  • 继承中的同名static静态变量; 继承中的同名变量; 继承中的static静态变量; 继承中的同名static静态变量; 总结; 阅读之前注意: 本文阅读建议用时:35min

    继承中的同名static静态变量

    • 继承中的同名变量
    • 继承中的static静态变量
    • 继承中的同名static静态变量
    • 总结

    阅读之前注意:

    本文阅读建议用时:35min
    本文阅读结构如下表:

    项目 下属项目 测试用例数量
    继承中的同名变量 1
    继承中的static静态变量 0
    继承中的同名static静态变量 1
    总结 0

    继承中的同名变量

    对于继承中的同名变量,比如对于下面的代码:

    #include"iostream"
    using namespace std;
    
    class base
    {
    public:
    	int a, b;
    };
    
    class derived:public base
    {
    public:
    	int b, c;
    };
    
    void main()
    {
    	derived d;
    	d.a = 1;
    	d.base::b = 2;//访问基类中的b
    	d.b = 3;
    	d.c = 4;
    }
    

    C++编译器在内存中会按下图规则处理:
    这里写图片描述

    继承中的static静态变量

    如果是基类中的static静态变量,则由基类及其派生类所共享。
    如果是派生类类中的static静态变量,则只能从派生类访问或者从派生类的派生类访问。

    继承中的同名static静态变量

    如果派生类中也定义了一个和基类中重名的static静态变量,那么两个静态变量都在静态区有自己的地址,而由继承中的同名变量处理规则可以知道,直接由派生类访问时(没有加域作用符),这个静态变量会屏蔽掉基类的同名成员。
    具体参考以下代码:

    #include"iostream"
    using namespace std;
    
    class parent
    {
    public:
    	parent()
    	{
    		cout << "parent a=" << a << endl;
    		cout << "parent &a=" << &a << endl;
    	}
    	static int a;//父类中的静态变量
    private:
    
    };
    
    int parent::a = 1;//这句话很重要:为静态变量开辟了内存空间
    
    class child : public parent
    {
    public:
    	child()
    	{
    		cout << "child a=" << a << endl;
    		cout << "child &a=" << &a << endl;
    	}
    	static int a;//子类中的静态变量(与父类中的重名)
    private:
    
    };
    
    int child::a = 2;//这句话很重要:为静态变量开辟了内存空间
    
    void main()
    {
    	child c1;
    	cout << "child c1.a=" << c1.a << endl;
    	cout << "child::a=" << child::a << endl;
    	cout << "parent::a=" << parent::a << endl;
    	system("pause");
    }
    

    运行结果如下图所示:
    这里写图片描述

    总结

    本篇博客的核心是:子类中的和父类中同名的static静态变量在静态区有自己的内存,由子类直接访问时,会屏蔽掉从父类继承来的静态变量。

    如果本文对你有帮助,不如请我一罐可乐吧 🍼
    在这里插入图片描述

    展开全文
  • PHP static静态变量

    千次阅读 2011-12-31 15:58:42
    PHP static静态变量 PHP static静态变量 变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子: 例子 ...
  • static静态变量使用@Value注入
  • 在学习static静态变量之前,我们还是有必要来了解 变量 的意义。程序要对数据进行读、写、运算等操作,当需要保存特定的值或结果的时候就需要用到变量,在用户看来,变量是用来描述一条信息的名称,在变量中可以储存...
  • static 静态变量 1、定义格式 静态变量static关键字修饰的变量 public static int staticVariable = 1 ; //定义静态变量 public int normolVariable = 2 ; //普通变量 2、调用方法 我们现在example27类中写一个...
  • 如何区分const char*p 和char* const p? 画一条垂直线穿过上述指针声明的星号位置,如果const出现在线的左边,指针指向的...static 静态变量  静态变量和全局变量都储存在一个叫静态存储区的内存区域内。静态存储区与
  • Static静态变量与非静态变量的区别 内存分配 静态变量在应用程序初始化时,就存在于内存中,直到它所在的类的程序运行结束时才消亡; 而非静态变量需要实例化后才分配内存。 生存周期 静态变量生存周期为应用程序的...
  • Android 中static静态变量幽灵
  • PHP重置static静态变量

    千次阅读 2018-12-05 08:46:18
    PHP重置static静态变量 1、代码: &lt;?php /** * @todo 赠送虚拟币类 */ class GivenCoin{ const NEW_REGISTER = 1; //用户注册 const PERFECT_INFO ...
  • JAVA Static静态变量

    千次阅读 2014-10-17 18:04:58
    静态变量     是静态修饰符, 什么叫静态修饰符呢?大家都知道, 在程序中任何变量或者代码都是在编译 时由系统自动分配内存来存储的, 而所谓静态就是指在编译后所分配的内存会一直存在...
  • android 尽量不要使用static静态变量

    千次阅读 2018-12-07 15:53:56
    使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放; 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误。 3.不能将activity作为static静态对象,这样使activity的...
  • 1.Spring不支持依赖注入static静态变量 在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样: @Autowired private static YourClass yourClass; 可以试一下,yourClass在这种...
  • 以下所述,静态变量是前缀static关键字的,非静态变量即普通变量。 一、普通静态变量: 1.局部变量在函数完成时就会自动释放,而用static声明的局部变量不会被释放,它的生存周期是全局的,可见性是块内。 2.用...
  • c++ static静态变量

    2019-06-13 08:30:23
    static静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化; 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;始终驻留在全局数据区,直到程序...
  • static 静态变量生命周期

    千次阅读 2018-05-20 10:49:40
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
  • static静态变量使用@Value注入方式 错误写法 @Component public class MyConfig { @Value("${env}") private static String env; public static String getEnv() { return env; } public ...
  • static静态变量的生命周期

    千次阅读 2018-06-17 18:13:01
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
  • C语言之static静态变量

    2016-03-06 10:41:17
    静态变量的类型 说明符是static静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态...
  • static静态变量用法

    2018-06-07 14:35:40
    第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件...
  •  全局变量的说明之前再加上static就构成静态全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上没有区别。区别在于,非静态全局变量的作用域是整个源程序,当一个源...
  • static静态变量作用

    2019-03-29 09:53:21
    加在局部变量前面,静态变量,改变了原有变量的生存周期,但不会改变作用域! 加在全局变量前面,限制作用域为文件作用域,只能在该文件中使用,不能被其他文件使用。 加在函数前面,限制了函数的作用域到文件作用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,286
精华内容 15,314
关键字:

static静态变量