1 static 的基本用法
static关键字所表达的意思就是使得被修饰的变量可以直接通过类调用,static 修饰的方法或者变量,不需要依赖对象来访问,只要被类加载,就可以通过类去访问。
具体一般有静态方法,静态变量,静态代码块。
静态方法:静态方法里是没有this的,因为不需要依附某个对象访问,静态方法里不能访问非静态成员变量和非静态成员方法,因为非静态需要依赖对象,又可能对象没创建,所以不能访问,但是 反过来,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。
静态变量:静态变量在类初次加载的时候被初始化,只有一个副本,被所有对象共享。static成员变量初始化顺序按照定义的顺序来进行初始化。与非静态变量相比,非静态变量是在创建对象的时候初始化的,存在多个副本,各个对象拥有的副本互相不会影响。
静态代码块:静态代码块在类初始化的时候去执行,静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。 在类初次被加载时,会按照静态初始化块的顺序来执行每个块,并且只会执行一次。用于只需要初始化一次的操作,可以提高程序性能,减少不必要的产生相同对象导致的资源浪费。
2 static的加载顺序
如果类还没有被加载:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
2、执行子类的静态代码块和静态变量初始化。
3、执行父类的实例变量初始化
4、执行父类的构造函数
5、执行子类的实例变量初始化
6、执行子类的构造函数
如果类已经被加载:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。
3 static在JVM上的表现
在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中。
4 static与单例的应用举例
/** * @author admin * @version 1.0.0 * @Description 单例懒汉模式 * @createTime 2020年10月04日 16:00:00 */ public class SingletonLazy { private static SingletonLazy singletonLazy = null; private SingletonLazy() { } public static synchronized SingletonLazy getInstance() { synchronized (SingletonLazy.class) { if (singletonLazy == null) { singletonLazy = new SingletonLazy(); } return singletonLazy; } } }
/** * @author admin * @version 1.0.0 * @Description 单例饿汉 * @createTime 2020年10月04日 16:07:00 */ public class SingletonHunger { private static final SingletonHunger singletonHunger = new SingletonHunger(); private SingletonHunger(){ } public static SingletonHunger getInstance(){ return singletonHunger; } }