精华内容
参与话题
问答
  • spring注入静态变量

    万次阅读 2019-06-30 23:50:10
    静态变量并不属于对象的属性,而是属于类的属性,而Spring则是基于对象的属性进行依赖注入的。所以用注解注入静态变量是不可行的,会一直报NullPointerException 例如 :直接注入静态的redisTemplate是不行的 @...

    前言
    平时开发当中,需要封装工具类,工具类中的方法大多是静态的方法,而静态方法只能调用静态成员变量。静态变量并不属于对象的属性,而是属于类的属性,而Spring则是基于对象的属性进行依赖注入的。所以用注解注入静态变量是不可行的,会一直报NullPointerException

    例如 :直接注入静态的redisTemplate是不行的

    @Autowired
    private static RedisTemplate<Object, Object> redisTemplate;
    

    解决方案

    方法一、 在set方法上注入

    @Component
    public class RedisLockUtil {
        private  static  RedisTemplate<Object, Object> redisTemplate;
        @Autowired
        public  void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
            RedisLockUtil.redisTemplate = redisTemplate;
        }
     }
    

    方法二、 使用@PostConstruct注解
    @PostConstruct用于在完成依赖项注入以执行任何初始化之后需要执行的方法

    @Component
    public class RedisLockUtil {
      
        private  static  RedisTemplate<Object, Object> redisTemplate;
        @Autowired
        private  RedisTemplate<Object,Object> redisTemplate_copy;
        /**
         * 初始化 init
         */
        @PostConstruct
        public void init(){
          RedisLockUtil.redisTemplate=redisTemplate_copy;
        }
     }
    

    或者

    @Component
    public  class RedisLockUtil {
    	private static RedisLockUtil redisLockUtil;
    	@Autowired
    	private RedisTemplate<Object, Object> redisTemplate;
    	/**
    	 * 初始化 init
    	 */
    	@PostConstruct
    	public void init(){
    		redisLockUtil = this;
    		redisLockUtil.redisTemplate = this.redisTemplate;
    	}
    

    注: 两种方法类上@Component一定要写上

    展开全文
  • 静态变量

    千次阅读 2007-05-30 15:23:00
    静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。...
     静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
    由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

      1. 静态局部变量

      在局部变量的说明前再加上static说明符就构成静态局部变量。

      例如:

    static int a,b;
    static float array[5]={1,2,3,4,5};

     
      静态局部变量属于静态存储方式,它具有以下特点:

      (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

      (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

      (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

      (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的 副作用,因此仍以采用局部静态变量为宜。

      [例5.15]

    main()
    {
    int i;
    void f(); /*函数说明*/
    for(i=1;i<=5;i++)
    f(); /*函数调用*/
    }
    void f() /*函数定义*/
    {
    auto int j=0;
    ++j;
    printf("%d/n",j);
    }

      程序中定义了函数f,其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:

    main()
    {
    int i;
    void f();
    for (i=1;i<=5;i++)
    f();
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }

      由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。读者可自行分析其执行过程。

      2.静态全局变量

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

      四、寄存器变量

      上述各类变量都存放在存储器内, 因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

      [例5.16]

    求∑200i=1imain()

    {
    register i,s=0;
    for(i=1;i<=200;i++)
    s=s+i;
    printf("s=%d/n",s);
    }

      本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:

      1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

      2. 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器,由于CPU 中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。

      三、静态变量

      静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
    由此看来, 一个变量可由static进行再说明,并改变其原有的存储方式。

      1. 静态局部变量

      在局部变量的说明前再加上static说明符就构成静态局部变量。

      例如:

    static int a,b;
    static float array[5]={1,2,3,4,5};

     
      静态局部变量属于静态存储方式,它具有以下特点:

      (1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。

      (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

      (3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。

      (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的 副作用,因此仍以采用局部静态变量为宜。

      [例5.15]

    main()
    {
    int i;
    void f(); /*函数说明*/
    for(i=1;i<=5;i++)
    f(); /*函数调用*/
    }
    void f() /*函数定义*/
    {
    auto int j=0;
    ++j;
    printf("%d/n",j);
    }

      程序中定义了函数f,其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时,j均赋初值为0,故每次输出值均为1。现在把j改为静态局部变量,程序如下:

    main()
    {
    int i;
    void f();
    for (i=1;i<=5;i++)
    f();
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }
    void f()
    {
    static int j=0;
    ++j;
    printf("%d/n",j);
    }

      由于j为静态变量,能在每次调用后保留其值并在下一次调用时继续使用,所以输出值成为累加的结果。读者可自行分析其执行过程。

      2.静态全局变量

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

      四、寄存器变量

      上述各类变量都存放在存储器内, 因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。 为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写, 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。

      [例5.16]

    求∑200i=1imain()

    {
    register i,s=0;
    for(i=1;i<=200;i++)
    s=s+i;
    printf("s=%d/n",s);
    }

      本程序循环200次,i和s都将频繁使用,因此可定义为寄存器变量。对寄存器变量还要说明以下几点:

      1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。

      2. 在Turbo C,MS C等微机上使用的C语言中, 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器,由于CPU 中寄存器的个数是有限的,因此使用寄存器变量的个数也是有限的。
    展开全文
  • 静态变量static

    千次阅读 多人点赞 2018-09-05 21:09:07
    静态变量静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放 ,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来...

    静态变量
    静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放 ,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来。
    所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
    静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。

    展开全文
  • 初学java,看到书上的编纂,可能出现了错误。...那就感觉一定要静态方法才能调用静态变量的感觉,和网上的说法又有冲突。 我知道静态方法是不可以调用非静态的变量和非静态方法的。 对于非静态方法现在混乱了。求解答
  • 静态变量不能跨函数使用

    万次阅读 2019-12-06 22:43:55
    因为调用function()函数已经执行完毕函数内存的静态变量已经释放,p就不能指向i 但是却把 i的内存变量值读取出来了,这是不可以的。静态变量不可以跨函数使用 #include <stdio.h> void function(int ** q) ...

     这个程序从语法上没有错误,但是从逻辑上讲是有问题的。因为调用function()函数已经执行完毕函数内存的静态变量已经释放,p就不能指向 i   但是却把 i 的内存变量值读取出来了,这是不可以的。静态变量不可以跨函数使用

    #include <stdio.h>
    
    void function(int ** q) {  //q是个指针变量,无论q是什么类型指正变量,都只占4个字节
    
    	int i = 5;
    	*q = &i;
    }
    
    int main(void) {
    
    	int *p;
    
    	function(&p);
    	printf("%d\n", *p);
    	while (true){}
    	return 0;
    }

    展开全文
  • class string1 { String s1="pingguo"; String s2="xiangjiao"; String s3=new String("lizi"); String s4=new String("li"); public static void main(String args[]) ... System.out.println("s1==s2");...
  • 静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量...
  • 先是定义私有静态变量,然后静态代码块初始化。 ![图片说明](https://img-ask.csdn.net/upload/201811/09/1541745043_546543.png) 标红这行报错,空指针异常。 个人疑问,是否是因为B/S结构...
  • 1.java在内存紧缺时候会回收掉不用的静态变量的内存吗? 2.一个类中含有对静态变量的引用,当这个类不使用的时候会被垃圾回收吗?
  • 里面有介绍静态变量的初始化过程,简单来说就是 ``` public class Test { // 静态变量的声明 public static int _i = 10; } //上面的代码相当于下面 public class Test { // 静态变量的声明 public ...
  • c# 静态变量与非静态变量区别

    千次阅读 2015-05-23 16:08:31
    c# 静态变量与非静态变量区别 静态变量静态变量使用 static 修饰符进行声明 在所属类被装载时创建 生存周期为应用程序的存在周期 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值(全局变量,被所有类...
  • 静态的成员变量与非静态的成员变量的区别: 作用上的区别: 静态的成员变量的作用共享一个 数据给所有的对象使用。 非 静态的成员变量的作用是描述一类事物的公共属性。 数量与存储位置上的区别: 静态成员变量是...
  • 非静态函数,非静态变量与静态函数,静态变量 一、函数 函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调...
  • 静态变量与非静态变量的区别

    千次阅读 2016-09-04 16:16:57
    静态变量或方法: 就是以static修饰的变量或方法, 如static int count; 它的意义是让系统分配一个静态空间给这个变量count, 那么包含这个变量的类的全部实例就会共用这个变量, 任何一个改变了count都会对其余的...
  • 转载:https://www.cnblogs.com/DannyShi/p/4584750.html 1、static关键字作用 1.1 隐藏   eg: //a.c文件中 char a = 'A'; void msg() {  printf("Hello\n"); } ...输出结...
  • 静态变量和非静态变量的区别

    千次阅读 2013-09-03 21:33:49
    静态变量和非静态变量的区别: 非静态变量可以有局部变量和全局变量 静态变量实际上就是指在内存中的地址是静态不变的。 1、内存分配:局部变量存储在堆区或者栈区,静态变量和全局变量一样存储在全局区, 静态...
  • [Java]静态变量与非静态变量的区别

    千次阅读 2016-08-30 12:56:47
    ①java类的成员变量有俩种: ...类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周
  • C语言中的静态变量和非静态变量

    万次阅读 2017-11-30 15:05:52
    1.全局静态变量:在全局变量前面加上关键词static,全局变量就被定义成一个全局静态变量。 (1)内存中的位置:静态存储区。 (2)作用域:在程序任何地方都是可见的。 2.局部静态变量:在局部变量前面加上关键词...
  • 静态变量与动态变量

    万次阅读 多人点赞 2018-08-02 20:21:10
    静态变量,全局动态变量都是静态存储 2)动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放 3)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。通常把由于变量存储方式...
  • 局部静态变量:静态区 全局变量: 静态区的常量区 全局静态变量:静态区 在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:   1、栈区(stack)— 由编译器自动分配...
  • 全局变量、全局静态变量、局部变量、局部静态变量区别
  • C#中的静态变量与非静态变量

    千次阅读 2020-01-29 16:38:55
    一:为什么要有静态变量 C#中没有全局变量的概念,所有的变量必须由该类的实例进行操作,这样做是为了提升安全性,但是有些时候会显得很不方便,所以引入了静态变量 二:静态变量与非静态变量的区别 ——静态变量...
  • 因为之前在百度百科上看到有位大佬说全局变量也是静态变量,毕竟全局变量也是存储在静态存储区的嘛。。 求各位大佬解释一下吧。。![图片说明]...
  • C#静态变量

    2010-11-22 15:11:00
    如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)里,然而,这样的变量要在不同图书(实例)里重复存储,图书(实例)数量少的话,我们还能接受,如果图书(实例)数量较多的话,比如成千上万,我们...
  • 静态成员变量,不能使用this,super关键字,可以使用在静态方法中,也可以使用在非静态方法非静态变量:1.属于对象中的属性2.对象被初始化存放在,堆内存区中(因为对象一直存放在堆内存区域中)3.非静态变量,不能...
  • 1.全局静态变量只能被当前源文件引用,不能被工程里其它源文件引用。 除了这点特殊,其它与普通的全局变量一样。 2.局部静态变量,只执行一次初始化,只能被所在函数引用,函数执行 完毕,变量仍存在,生存周期...

空空如也

1 2 3 4 5 ... 20
收藏数 86,301
精华内容 34,520
关键字:

静态变量