精华内容
下载资源
问答
  • 2021-07-11 00:33:11

    1.具有隐藏的作用

    当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。

    a.c:

    char a = 'A';  //  global variable
    void msg() 
    {
        printf("Hello\n"); 
    }

    main.c

    int main( void)
    {    
         extern  char a;     //  extern variable must be declared before use
        printf("%c ", a);
        ( void)msg();
         return 0;
    }

    程序的运行结果是:

    A Hello

    你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

    如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

    2.保持变量内容的持久

    变量不加 static 修饰:

    #include <stdio.h>
    
    void test()
    {
        int num = 0;
        num++;
        printf("%d ", num);
    }
    int main()
    {
        int i = 0;
        for (i = 0; i < 10; i++)
        {
            test();
        }
        return 0;
    }

    输出:1 1 1 1 1 1 1 1 1 1 1

    变量被 static 修饰:

    #include <stdio.h>
    
    void test()
    {
        static int num = 0;
        num++;
        printf("%d ", num);
    }
    int main()
    {
        int i = 0;
        for (i = 0; i < 10; i++)
        {
            test();
        }
        return 0;
    }

    输出:1 2 3 4 5 6 7 8 9 10

    3.默认初始化为0(static变量)

    其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

    static int x;  //初始化时x=0;

    static 关键字在C++中的作用:静态成员变量和静态成员函数

    C++ - 静态成员变量和静态成员函数_同学小辜的博客-CSDN博客

    更多相关内容
  • 关键字static作用

    万次阅读 多人点赞 2019-05-05 12:21:14
    在C语言中,关键字static有三个明显作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能...

    1、 关键字static的作用是什么?

    正确答案:
    这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
    1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
    3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。 大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数 据和代码范围的好处和重要性。

     

    2.static关键字的作用

     

    •   修饰局部变量

        static修饰局部变量时,使得被修饰的变量成为静态变量,存储在静态区。存储在静态区的数据生命周期与程序相同,在main函数之前初始化,在程序退出时销毁。(无论是局部静态还是全局静态)

     

    •   修饰全局变量

        全局变量本来就存储在静态区,因此static并不能改变其存储位置。但是,static限制了其链接属性。被static修饰的全局变量只能被该包含该定义的文件访问(即改变了作用域)。

     

    •   修饰函数

         static修饰函数使得函数只能在包含该函数定义的文件中被调用。对于静态函数,声明和定义需要放在同一个文件夹中。

    •   修饰成员变量

          用static修饰类的数据成员使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象,所有的对象都只维持同一个实例。 因此,static成员必须在类外进行初始化(初始化格式:int base::var=10;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化。

    •   修饰成员函数

         用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针,因而只能访问类的static成员变量。静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。例如可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好,比如定义一个数学函数类Math,调用Math::sin(3.14);还可以实现某些特殊的设计模式:如Singleton;

    最重要的特性:隐藏

        当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

    不可以同时用const和static修饰成员函数。

       C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

    例1:修饰成员变量:同一个类的所有实例共享一个静态成员变量

    #include<iostream>
    
    using namespace std;
    class S1
    {
    public:
    	static int a;
    	void say(){
    		cout << a << endl;
    	}
    protected:
    private:
    };
    int S1::a = 10;
    void main(){
    	S1 s1;
    	S1 s2;
    	s1.a = 5;
    	s1.say();//5
    	s2.say();//5
    	s2.a = 6;
    	s1.say();//6
    	
    	system("pause");
     
    }

     

    展开全文
  • 面向对象部分让人搞晕的几个关键字,我这里专门针对这几个关键字进行了整理相关的面试题,只要你能做对80%,就证明你面向对象基本学懂了
  • static关键字的含义及使用场景static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为...

    今天主要学习下Java语言中的static关键字。

    static关键字的含义及使用场景

    static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)

    class A {

    static {

    System.out.println("A : 静态代码块");

    }

    static int i ; // 静态变量

    static void method() {

    System.out.println("A: 静态方法");

    }

    }

    简而言之,被static关键字修饰的内容都是静态的。

    静态是相对于动态的,动态是指Java程序在JVM上运行时,JVM会根据程序的需要动态创建对象并存储对象(分配内存),对象使命结束后,对象会被垃圾回收器销毁,即内存回收由JVM统一管理并分配给其他新创建的对象;静态是指Java程序还没有运行时,JVM就会为加载的类分配空间存储被static关键字修饰的内容;如静态成员变量,Java类加载到JVM中,JVM会把类以及类的静态成员变量存储在方法区,我们知道方法区是线程共享且很少发生GC的区域,所以被static关键字修饰的内容都是全局共享的,且只会为其分配一次存储空间。

    所以当类的某些内容不属于对象,而由对象共享即属于类的时候,就可以考虑是否用static关键字进行修饰。

    static关键字的的作用

    1 修饰代码块

    类中用static关键字修饰的代码块称为静态代码,反之没有用static关键字修饰的代码块称为实例代码块。

    实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,表现出来就是实例代码块的运行结果会影响当前对象的内容,并随着对象的销毁而消失(内存回收);而静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次。

    因为静态代码块的主要作用是用来进行一些复杂的初始化工作,所以静态代码块跟随类存储在方法区的表现形式是静态代码块执行的结果存储在方法区,即初始化量存储在方法区并被线程共享。

    2 修饰成员变量

    类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),因此静态成员变量也能称为静态变量。静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。

    public class StaticTest {

    public static void main(String[] args) {

    System.out.println(D.i);

    System.out.println(new D().i);

    }

    }

    class D {

    static {

    i = 2;

    System.out.println("D : 静态代码块1");

    }

    static int i;

    }

    运行结果:

    D : 静态代码块1

    2

    2

    静态变量存储在类的信息中,且可以在线程间共享,那么它当然也属于该类的每个对象,因此可以通过对象访问静态变量,但编译器并不支持这么做,且会给出警告。

    注意:

    一个类的静态变量和该类的静态代码块的加载顺序。类会优先加载静态变量,然后加载静态代码块,但有多个静态变量和多个代码块时,会按照编写的顺序进行加载。

    class D {

    static {

    i = 2;

    System.out.println("D : 静态代码块1");

    }

    static {

    i = 6;

    System.out.println("D : 静态代码块2");

    }

    static int i;

    }

    可以想一下运行的结果。

    静态变量可以不用显式的初始化,JVM会默认给其相应的默认值。如基本数据类型的byte为0,short为0,char为\u0000,int为0,long为0L,float为0.0f,double为0.0d,boolean为false,引用类型统一为null。

    静态变量既然是JVM内存中共享的且可以改变,那么对它的访问会引起线程安全问题(线程A改写的同时,线程B获取它的值,那么获取的是修改前的值还是修改后的值呢?),所以使用静态变量的同时要考虑多线程情况。如果能确保静态变量不可变,那么可以用final关键字一起使用避免线程安全问题;否则需要采用同步的方式避免线程安全问题,如与volatile关键字一起使用等。

    static关键不能修饰局部变量,包括实例方法和静态方法,不然就会与static关键字的初衷-共享相违背。

    3 修饰方法

    用static关键字修饰的方法称为静态方法,否则称为实例方法。通过类名.方法名调用,但需要注意静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。

    class D {

    static {

    i = 2;

    System.out.println("D : 静态代码块");

    }

    static final int i;

    int j;

    static void method() {

    System.out.println(i);

    System.out.println(new D().j);

    method1();

    new D().method2();

    }

    static void method1() {

    System.out.println(i);

    }

    void method2() {

    System.out.println(i);

    }

    }

    注意:既然类的实例方法需要对象调用才能访问,而静态方法直接通过类名就能访问,那么在不考虑部署服务器的情况下,一个类是如何开始执行的呢?最大的可能就是通过“类名.静态方法”启动Java,而我定义那么多静态方法,JVM又是如何知道主入口呢?

    或许,你想到了main方法。

    没错,就是main方法被Java规范定义成Java类的主入口。Java类的运行都由main方法开启:

    public static void main(String[] args) {

    for (String arg : args) { // 参数由外部定义System.out.println(arg);

    }

    }

    但注意main并不是Java关键字,它只是一个规定的程序入口的方法名字;另外main方法可以重载。

    注意:static关键字虽然不能修饰普通类,但可以用static关键字修饰内部类使其变成静态内部类。static关键字本身的含义就是共享,而Java类加载到JVM内存的方法区,也是线程共享的,所以没必要用static关键字修饰普通类。

    static关键字的缺点

    封装是Java类的三大特性之一,也是面向对象的主要特性。因为不需要通过对象,而直接通过类就能访问类的属性和方法,这有点破坏类的封装性;所以除了Utils类,代码中应该尽量少用static关键字修饰变量和方法。

    作者:Starry-

    来源:CSDN

    展开全文
  • 深入理解C语言static关键字三个作用

    千次阅读 多人点赞 2022-04-11 10:34:48
    目录static修饰局部变量static 修饰全局变量static 修饰函数总结 static修饰局部变量 图一:test 函数里面定义的 a 是局部变量,局部变量在栈区上开辟空间,栈区的使用特点是进入变量的生命周期时自动为其开辟空间...

    static修饰局部变量

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    图一:test 函数里面定义的 a 是局部变量,局部变量在栈区上开辟空间,栈区的使用特点是进入变量的生命周期时自动为其开辟空间,离开变量的生命周期时自动销毁对应空间,所以这里每次调用 test 函数时 a 都会被重新定义并初始化为0,所以屏幕上打印的是10个1;

    图二:我们把 a 用 static 修饰后发现屏幕打印的是1到10,就好像每次调用完 test 函数后 a 并没有被销毁,而是继续使用,下次调用 test 函数时 a 直接在之前的基础上进行 ++ 操作。
    所以 static 修饰局部变量的作用是:改变局部变量的生命周期,本质上是改变了局部变量的存储位置,让局部变量不再是在栈区上开辟空间,而是直接在静态区上开辟空间,从而使得局部变量拥有和全局变量一样的生命周期,即随着整个程序生成和销毁。

    更深入的理解 static 修饰局部变量的作用:图三,我们的程序从源文件(.c文件)变成可执行程序(.exe文件)需要经过编译链接运行三个环节,而编译环节又分为预处理、编译、汇编三个阶段,在汇编阶段,编译器会把我们的C语言代码转换成汇编代码,而每一条C语言语句都对应着多句汇编代码,然而在图三中,我们可以观察到,只有 static int a = 0; 这条语句没有对应的汇编代码,也就是说,C语言在编译的时候会直接跳过这条语句。
    本质上是:在编译环节的编译阶段编译器就会为被 static 修饰的局部变量分配空间,所以C程序在运行的过程中会直接跳过 static 修饰的语句,也就是说,在第二次及以上甚至第一次调用 test 函数时 static int a = 0; 这条语句都不会被执行。

    static 修饰全局变量

    在这里插入图片描述在这里插入图片描述

    图一图二对比分析:我在Add.c中定义了一个全局变量g_val,因为全局变量具有外部链接属性,所以我只需要在test.c中对g_val进行声明之后就可以正常使用了,但是当我用 static 来修饰g_val时,我们发现,编译器说g_val是无法解析的外部符号;
    所以 static 修饰全局变量的作用是:改变了全局变量的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问),给我们的感觉是全局变量的作用域变小了。

    static 修饰函数

    在这里插入图片描述在这里插入图片描述

    图一图二对比分析:这里和 static 修饰全局变量非常类似,我在Add.c中定义了一个Add函数,因为函数也具有外部链接属性,所以我只需要在test.c中对Add函数进行声明之后就可以正常使用了,但是当我用 static 来修饰Add函数时,我们发现,编译器说Add是无法解析的外部符号;
    所以 static 修饰函数的作用是:改变了函数的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问),给我们的感觉是函数的作用域变小了。

    总结

    • static 修饰局部变量的作用:改变局部变量的生命周期,本质上是改变了局部变量的存储位置,让局部变量不再是在栈区上开辟空间,而是直接在静态区上开辟空间,从而使得局部变量拥有和全局变量一样的生命周期,即随着整个程序生成和销毁。
    • static 修饰全局变量的作用:改变了全局变量的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。
    • static 修饰函数的作用是:改变了函数的外部链接属性(可以在其他源文件内被访问),使其变成内部连接属性(只能在本文件内部被访问)。
    展开全文
  • 在C语言中,关键字static的意思是静态的,主要有三作用:(修饰函数,全局变量,局部变量) (1)在函数体内,一被声明为静态的变量在这一函数被调用的过程中其值维持不变。 (2)在模块内(但是在函数外),...
  • static关键字的3大作用

    千次阅读 2009-04-04 19:29:00
    static作用 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多文件时,所有未加static前缀的全局变量和函数都具有全局...
  • java中的static关键字

    千次阅读 2021-03-09 00:29:26
    一、static代表着什么在Java中并不存在全局变量的概念,但是我们可以通过static来实现一“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。...
  • static关键字的作用(有三个作用

    千次阅读 多人点赞 2019-09-26 14:52:10
      当同时编译多文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 (2)保持变量内容的持久   存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量...
  • 给变量加上static关键字后,此变量变为全局变量,JVM在加载时会直接将此变量加载到方法区里而不是堆里,无论哪一方法修改了此变量,此变量就会改变,可以让对象共享属性并且,当再次new该类的对象时,static修饰的...
  • java中static关键字作用

    千次阅读 2021-02-12 11:21:11
    java中static关键字主要两种作用:第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,实现某个方法或属性与类而不是对象关联在一起简单来说,在Java语言中,static主要5中使用...
  • C语言中static关键字作用

    千次阅读 2018-05-03 21:19:41
    在C语言中static作用如下 第一 在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命...第 static修饰一函数,则这函数的只能在本文件中调用,不能被其他文件调用。Static修饰...
  • 前言 ...今天就来好好复习下这个关键字,本文的重点也在第部分。 先看一下示例代码: test1.cpp #include extern int a_int; extern void func2(); static char c_array[10000]; void func1() {
  • static关键字的用法与作用

    万次阅读 多人点赞 2018-08-29 21:17:44
    在java的关键字中,static和final是两我们必须掌握的关键字。不同于其他关键字,他们都...static是java中非常重要的一个关键字,而且它的用法也很丰富,主要四种用法: 用来修饰成员变量,将其变为类的成员,...
  • final和static关键字作用

    千次阅读 2020-09-27 20:48:05
    前俩都好理解,重点就第句,被final修饰的变量不能被改变,通常会理解为值不变,也就是内容不变(我觉得是因为String是不可变的,导致错觉),到底是变量的引用还是引用的内容不变呢? 可以看见16-18行,...
  • 一、关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。 static 的两大作用: 一、控制存储方式 static...
  • Java 1.8对接口方面的增强:接口中可以添加使用default或者static修饰的方法 增加default方法:又叫做接口扩展方法,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加...
  • 【总结】static关键字的用法及作用

    千次阅读 2020-02-23 15:57:03
    首先,我们要明确static是静态关键字。在C语言和C++中,我们都会用到static关键字,并且对于static不同的用法和作用。...(1)定义全局静态变量:在全局变量前加上关键字static,该全局变量就变成了全局静态变...
  • 接上文:C语言的32个关键字C语言 static 关键字的常见用法有三种:用于局部变量的修饰符;用于全局变量的修饰符;用于函数的修饰符。1、用于局部变量的修饰符当 static 用于修饰局部变量时,通常是在某个函数体内,...
  • static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 void test1(void) { unsigned char a; static unsigned char b; …...
  • C语言中static关键字用法和作用

    千次阅读 多人点赞 2021-04-11 00:15:44
    static关键字可以修饰:局部变量、全局变量、函数 static修饰后改变了什么? 1.改变了生存周期; 2.改变了作用域; static修饰不同对象时的作用: 1.局部变量: 局部变量就是在函数内定义的变量,普通的局部变量...
  • 随着编程经验的积累大部分还是知道是什么意思的,但在概念上和具体的用法上却依然有些模糊,故特意整理汇总了下三个比较常见的关键字——const/static/extern。 二、关键字const/static/extern的释义和用法 1、...
  • static关键字详解

    2017-09-17 09:54:21
    二、static属性与非static属性还有一最大的区别,所有的非static属性必须产生实例化对象之后才可以访问,但是static属性不受实例化对象的控制,也就是 说,在没有产生实例化对象的情况下依然可以使用static属性。 ...
  • 在C语言中,关键字static有三个明显作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用结束后不释放其存储空间。定义为static的局部变量的存储在全局区(静态区)而一般的局部变量存储在栈中。2). 在模块...
  • C++中static关键字作用

    千次阅读 2016-08-26 21:21:02
    在C语言中static作用如下第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部...第static修饰一函数,则这函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量
  • B类继承A类,相当于对A类的功能进行扩展,如果不希望对A类进行扩展,可以给A类加final关键字,这样的话,A类就无法继承了。 源代码中String就是没有子孙的  结论:final修饰的类无法被继承 二、final修饰的方法 ...
  • Static关键字作用有那些?

    千次阅读 2017-02-28 17:38:28
    Static可以用于修饰变量、方法、代码块、内部类和静态导包。 1、Static可以用于修饰变量 示例如下: package com.cn; public class TestStatic { private static int a = 10; public static void main...
  • 二、static在C语言中的作用(C++通用) 1、修饰变量 a、修饰全局变量(全局变量与静态全局变量的对比) 修饰全局变量:作用域仅限于变量被定义的文件中,其他文件即使用extern声明也无法直接使用此变量,extern...
  • 关键字static/const的作用

    千次阅读 2017-02-08 10:51:02
    在C语言中,关键字static有三个明显作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 2) 在模块内(但在函数体外),一个被声明为静态的变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 373,692
精华内容 149,476
关键字:

关键字static有三个明显作用