静态代码块:
有些代码需要在项目启动的时候就执行,就需要使用静态代码块。它是主动执行的,在项目启动的时候就初始化,也仅仅在第一次类加载的时候执行,之后不再执行
静态方法:
有些代码是在不创建对象的情况下,由其他程序来调用的,就需要使用静态方法。它是被动执行的,静态方法在类加载的时候就已经加载了,可以使用类名直接调用。
构造代码块:
直接在类中定义,但是没有加static关键字,每次初始化对象时都会调用。
1)java编译器编译java类时,会先将成员属性的声明放到类的前端
2)成员变量的初始化工作放到构造函数中
3)如果类中有构造代码块,java编译器在编译时会先将构造代码块中的代码移到构造函数中执行,构造函数中原有的代码最后执行
4)成员属性的初始化和构造代码块的执行顺序是根据原码中的位置执行
局部代码块:
在函数中的代码块,在方法中如果要缩短变量的寿命,可以使用它。
方法中,某段代码之后,都不再使用某个变量(这个变量有可能是一个很大的Map集合,很占内存),则可以将其定义到局部代码块中,及时结束其生命周期,释放空间!
public class UseNormalBlack { public static void main(String[] args) { new Black().run(); } } class Black { public void run() { int num = 2; { int i = 3; //局部代码块,变量i出了局部代码块就没有任何作用 System.out.println("这里是局部代码块" + (i)); } System.out.println("这里是普通方法run()"); } }
代码块的执行顺序:
静态代码块>构造代码块>构造方法,父类先于子类
父类静态代码块——>子类静态代码块——>父类构造块——>父类构造方法——>子类构造块——>子类构造方法
/** * 静态代码块>构造代码块>构造方法,父类先于子类 * 父类静态代码块——>子类静态代码块——>父类构造块——>父类构造方法——>子类构造块——>子类构造方法 */ class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I,m A class 构造代码块A"); } static { System.out.println("static A"); } } class HelloB extends HelloA { public HelloB() { System.out.println("helloB"); } { System.out.println("I,m B class 构造代码块B"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); new HelloB(); { System.out.println("我是局部代码块"); } } }