静态变量

Spring如何给静态变量注入值

↘锁芯ラ 提交于 2020-04-01 12:53:03
Common.java是一个工具类。 Spring无法直接给静态变量注入值,因为静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring忽略静态变量。所以如下这种写法就是错误的,这样是无法注入的,在使用该变量的时候会导致空指针错误: @Autowired private static IOptionService optionService; Spring 依赖注入是依赖set方法,静态变量不属于对象,只属于类。解决方法就是加上非静态的set方法,如下: private static IOptionService optionService; @Autowired public void setOptionService(IOptionService optionService) { Commons.optionService = optionService; } 这样就能在工具类中使用optionService了。 来源: https://www.cnblogs.com/zhangjianbing/p/9635807.html

spring 给静态变量注入值

主宰稳场 提交于 2020-04-01 12:51:19
一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public class StructUtil { private static AttendanceMapper attendanceMapper; @Autowired public void setAttendanceMapper(AttendanceMapper attendanceMapper) { StructUtil.attendanceMapper = attendanceMapper; } } 加上注解@Component,然后在静态变量的set方法上方加上@Autowired注解,注意:set方法不能为static类型. 来源: https://www.cnblogs.com/lishuaiqi/p/10416609.html

雷林鹏分享:Java 变量类型

故事扮演 提交于 2020-03-30 15:04:58
  在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:   type identifier [ = value][, identifier [= value] ...] ;   格式说明:type为Java数据类型。identifier是变量名。可以使用逗号隔开来声明多个同类型变量。   以下列出了一些变量的声明实例。注意有些包含了初始化过程。   int a, b, c; // 声明三个int型整数:a、 b、c。   int d = 3, e, f = 5; // d声明三个整数并赋予初值。   byte z = 22; // 声明并初始化z。   double pi = 3.14159; // 声明了pi。   char x = 'x'; // 变量x的值是字符'x'。   Java语言支持的变量类型有:   局部变量   成员变量   类变量   Java局部变量   局部变量声明在方法、构造方法或者语句块中;   局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;   访问修饰符不能用于局部变量;   局部变量只在声明它的方法、构造方法或者语句块中可见;   局部变量是在栈上分配的。   局部变量没有默认值,所以局部变量量被声明后,必须经过初始化,才可以使用。   实例1   在以下实例中age是一个局部变量

Java多线程中static变量的使用

老子叫甜甜 提交于 2020-03-30 11:44:35
线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。其实,这是一个有点难以定义的概念,不是很容易让人一听就懂的概念。“一个类可以被多个线程安全调用就是线程安全的”《 Java 并发编程实践》。 来说说静态变量、实例变量、局部变量在多线程下的安全问题吧! (一)静态变量:线程非安全 1、静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被 类的所有实例共享 。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是 全局 变量和全局方法,当声明它的类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。 2、静态变量使用的场景: (1)对象间共享值时 (2)方便访问变量时 3、静态方法使用注意事项: (1)不能在静态方法内使用非静态变量,即不能直接访问所属类的实例变量; (2)不能在静态方法内直接调用非静态方法; (3)静态方法中不能使用this和super关键字; 4

静态变量、全局变量和局部变量

家住魔仙堡 提交于 2020-03-28 06:44:07
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 堆和栈的区别: 一、预备知识——程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack)——由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—— 一般由程序员分配(如new、malloc)和释放(delete,free), 若程序员不释放,程序结束时可能由OS回收,但这样会导致内存泄露,严重的导致系统崩溃, 如一个程序是长期运行的,申请的变量永远都得不到释放,系统内存会耗尽。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放。 4、文字常量区 —— 常量字符串就是放在这里的。 程序结束后由系统释放 。 5、程序代码区 —— 存放函数体的二进制代码。 堆区就就是就是存放new出来的变量的 1.从作用域看: C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然

刚从京东面试回来,我才知道这些JVM知识有多重要

百般思念 提交于 2020-03-25 17:24:55
刚从京东面试回来,我才知道这些JVM知识有多重要 面试题 关于JVM的知识之前也写过相关的文章整理,但是从京东面试后,才发现这些JVM的知识点尤为重要,所以特意整理出来以供大家参考。 1.什么是类的加载? 2.哪些情况会触发类的加载? 3.讲一下JVM加载一个类的过程 4.什么时候会为变量分配内存? 5.JVM的类加载机制是什么? 6.双亲委派机制可以打破吗?为什么 答案放在文章的最后,来不及看原理也可以直接跳到最后直接看答案。 深入原理 类的生命周期 类的生命周期相信大家已经耳熟能详,就像下面这样: 不过这东西总是背了就忘,忘了又背,就像马什么梅一样,对吧? 其实理解之后,基本上就不会再忘了。 加载 加载主要做三件事: 1.找到类文件(通过类的全限定名来获取定义此类的二进制字节流) 2.放入方法区(将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构) 3.开个入口(生成一个代表此类的java.lang.Class对象,作为访问方法区这些数据结构的入口) 总的来讲,这一步就是通过类加载器把类读入内存。需要注意的是,第三步虽然生成了对象,但并不在堆里,而是在方法区里。 连接 连接分为三步,一般面试都比较喜欢问准备这一步。 校验 顾名思义,检查Class文件的字节流中包含的信息是否符合当前虚拟机的要求。 准备 这一步中将为静态变量和静态常量分配内存,并赋值。 需要注意的是

设计模式之单例模式

随声附和 提交于 2020-03-25 17:09:02
单例模式类图是23种设计模式类图中最简单的,因为它的类图上只有一个类! 什么时候会用到单例模式呢? 有一些对象我们只需要一个,比如说:线程池(ThreadPool)、缓存(cache)、日志对象、充当打印机设备的驱动程序的对象等等,如果创造出多个实例,就会出现程序行为异常或者与结果不一致的现象。 如何创造出独一无二的对象实例呢? 我们都知道:如果我有一个类NewObject(), 我想创建这个类的对象,怎么做?--------new NewObject()就可以了; 是不是可以无限创建呢? --------如果它是公开类就可以; 如果它的构造函数是私有的呢? -------那别的类就不可以实例化它了(调用不了它的构造函数); 那谁来实例化它呢? --------只能它自己进行实例化了; 那我怎么使用它呢? --------通过get方法暴露出来; 那么: public class NewObject{ //声明静态变量类 private static NewObject newObject; //构造函数私有化 private NewObject(); //get方法暴露出去以便其他类调用 public static NewObject getInstance(){ //判断变量类是否已经实例化 //如果newObject引用为null,表示还没有创建实例

成员变量和局部变量有什么区别?

此生再无相见时 提交于 2020-03-25 15:00:34
3 月,跳不动了?>>> FAQ2.13 成员变量和局部变量有什么区别? class A { int a;// 成员变量 public static void main(String[] args) { int b;// 局部变量 } } ———————————————————————————————————————————————————————————————————————————————————————— 类体由 2 部分构成 : 一部分是变量的定义 ; 一部分是方法的定义 ( 一个类中可以有多个方法 ) 在变量定义部分定义的变量叫做类的成员变量 , 成员变量在整个类中都有效 . ( 全局变量应该是成员变量的俗称 ) 在方法体中定义的变量叫做局部变量 , 局部变量只在定义它的方法中有效 . 成员变量又分为 实例变量 和 类变量 (static 静态变量 ). class One { float x; //x 为实例变量 static int y; // 只要有关键字 static,y 为类变量 } ———————————————————————————————————————————————————————————————————————————————————————— 1. 成员变量可以被 public , protect , private , static

JavaSE复习日记 : 多态

时光毁灭记忆、已成空白 提交于 2020-03-24 11:36:22
/** * 里氏替换原则 : * 能使用父类的地方,一定可以使用子类 * 什么是多态 : * 父类的引用,指向子类的对象 * 多态的前提条件 : * 有继承关系的两个类 * 多态的目的 : * ☆☆☆ 代码的重用 * 多态发什么在什么时候 : * 赋值的时候 * * !!!!!!!!! 多态中的 ☆☆☆ 覆写 是特指的 成员方法!!!!!!!!! * 什么是覆写 : * 就是在子类有个和父类相同的方法 : 方法名 , 参数列表 , 返回值类型 (和修饰符列表没关系) * 1 方法名相同 : 不相同,就是两个不一样的方法了 不是覆写 * 2 参数列表相同 : 参数列表不同,就是方法的重载了,也不是覆写 * 参数列表的 个数 和 数据类型 都相同 才叫相同吧 * 3 返回值类型相同 ; 返回值代表函数(方法)的功能,覆写是为了功能更强大,不能降低功能,所以必须相同 * 覆写之后 不能比原有的方法有更低的访问权限 ( 权限的降低 就意味着 功能的降低 ) * 覆写之后 不能比原有的方法有更宽泛的异常 ( 只能异常越来越低 ) * *!!!!! ☆☆☆ 父类的属性列表是在编译的时候就生成了 : 就是javac的时候☆☆☆ *!!!!! ☆☆☆ 子类的属性列表是在运行时才生成 : 就是java运行的时候☆☆☆ * * 父类和子类的调用有两种形式 : * 1 多态 父类引用指向子类的对象

C#单例模式

南楼画角 提交于 2020-03-22 00:02:47
1、定义 单例模式是确保一个类只有一个实例,并提供一个全局访问方式的设计方法 2、UML类图 3、应用场景 需要频繁实例化然后销毁的对象。 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 有状态的工具类对象。 频繁访问数据库或文件的对象。 4、C#实现单例模式 4.1 单线程单例模式 代码解析: Singleton的构造函数必须是私有的,确保外层无法通过new进行实例化对象 静态变量的生命周期同应用程序的生命周期相同,可以定义一个私有的全局静态变量_instance来保存该类的唯一实例 提供一个可访问的静态方法访问类的实例,在该方法内通过判断_instance是否为null,如果是null就创建一个实例,否则向外部返回实例 4.2 多线程单例模式 1) lock方式 代码解析: 外层if判断_instance不为null时,直接返回实例,避免每次获取实例时进行锁定,节省了 性能损耗 当外层判断成功时,使用lock锁定,保证只创建一个实例 2) 静态构造函数 代码解析: 静态构造函数只会执行一次 3) 静态变量初始化 代码解析: 静态变量在初次运行时就会初始化,readonly确保变量运行时无法修改 来源: https://www.cnblogs.com/kun2008/p/6686362.html