static关键字

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;
    }

}

 

原文地址:https://www.cnblogs.com/junbaba/p/13754564.html