static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
1. static可以修饰什么
- 被static修饰的变量属于静态变量,类变量,可以通过类名,变量名直接引用,不需要进行new一个新类。
- 被static修饰的方法属于静态方法,类方法,可以通过类名,方法名直接引用,而不需要new出来一个对象
- 静态块,用于初始化一个类的时候进行一些操作,静态变量、静态方法和静态代码块都只执行一次,而且只在初始化的时候执行。
静态代码块,静态方法,静态属性在类加载的时候进行加载,然后一直存在于内存,直至程序终止。
关于类加载:
- 在第一次创建一个类的对象或者第一次调用一个类的静态属性和方法的时候,会发生类加载
- 类加载期间,如果发现有静态属性,就给对应的静态属性分配内存空间,并赋值
- 类加载完成后再调用该类的静态属性,虚拟机会直接寻找该属性先前已经分配的内存空间地址,然后调用其值。同样,修改这个类的静态属性也一样
- 静态属性将永远占用某一块固定的内存空间,直到程序终止
2. 修饰变量、方法
static修饰的变量称为静态变量,静态变量和非静态变量的区别是:静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static修饰的方法一般称作静态方法,在静态方法中不能访问类的非静态成员变量和非静态成员方法,但是在非静态成员方法中是可以访问静态成员方法/变量的,如下图:
3. 修饰代码块
static关键字还有一个比较重要的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。如下图: