static关键字在我们平常的开发过程中经常使用,但是我们真的有去思考为什么在某些场景中需要使用static关键字,它的作用是什么?下面这篇文章给大家分析一下static关键字
一、static关键字的使用场景
修饰变量:使其成为静态变量
作用一:作为共享变量使用
public class StaticDemo {
private static final int MAX_NUMBER = 100;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
int a = scanner.nextInt();
if (a > MAX_NUMBER) {
System.out.println("你输入的数字大于100为: " + a);
} else {
System.out.println("你输入的数字小于100为: " + a);
}
}
}
作用二:减少对象的创建
public class StaticDemo {
private static final Logger LOG = LoggerFactory.getLogger(StaticDemo.class);
}
这句代码基本在每个类中都会有,声明一个Logger变量,实际上将static去掉也可以,比如:
public class StaticDemo {
private final Logger LOG = LoggerFactory.getLogger(StaticDemo.class);
}
这样就会导致每一个StaticDemo的实例化对象都会拥有一个Logger实例,如果创建了1000个StaticDemo实例,就会多出1000个Logger实例,造成资源的浪费,声明为static,减少内存资源的占用。
作用三:保留唯一副本:
最经典的莫过于单例模式,单例模式要求全局只保留唯一副本,比较适合使用
修饰方法:使其成为静态方法
将一个方法加上static关键字后,这个方法就成为了静态方法
区别:普通方法既可以访问静态成员又可以访问非静态成员,而静态方法只能访问静态成员
原因:静态方式和静态成员会随着类的定义被分配和加载到内存中,和普通属性只有实例化的时候才会被加载到内存
场景:通常是为了方便在不创建对象的情况下调用,不如一些工具类等
静态代码块
作用:静态代码块的作用通常来说是为了对静态变量进行一些初始化操作
代码:比如单例模式的类的实例化
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
场景:需要对一些值赋予初始化的时候可以使用
静态导入
作用:一般用于导入某个类或者某个包中的静态方法或者静态变量,不是很常用
二、static变量和普通成员变量的区别
所属不同:static变量属于类,不属于任何对象,而普通变量属于某个对象
存储区域不同:static变量位于方法区,普通成员变量位于堆区
生命周期不同:static变量生命周期与类的生命周期相同,而普通与其某个实例相同
序列化时不同:在对象序列化时,static变量会被排除在外
三、总结
希望能帮助到大家,谢谢!