存在意义
方便在没有创建对象的情况下来进行调用(方法/变量)
内存使用
static关键字存储在方法区中的静态常量池,所修饰的方法、变量和代码块都可以用来共享。
static修饰符
static 加载顺序
静态的东西优先加载,且只加载一次,在类初始化时进行执行,
创建类对象时从上往下执行一次非静态的初始化语句和初始化块,最后执行对应的构造函数
类加载时从上往下执行一次静态的初始化语句和初始化块
类加载的过程中遇到新创建对象的过程,从上往下执行非静态的触发语句,类加载优先于创建对象
代码示例—乱斗
public class Test extends Base{
static{
System.out.println("test static");
//加载过程中输出
}
public Test(){
System.out.println("test constructor");
//调用过程中输出
}
public static void main(String[] args) {
new Test();
}
}
class Base{
static{
System.out.println("base static");
//加载过程中输出
}
public Base(){
System.out.println("base constructor");
//调用过程中输出
}
}
输出结果:
base static
test static
base constructor
test constructor
执行过程:在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。