Java静态代码块和构造代码块
随着类的加载而执行,而且只执行一次。
作用:用于给类进行初始化。
执行顺序:静态代码块—>代码块—>构造函数
局部代码块的执行顺序不变。
当我们创建一个类的对象的时候,首先检查这个类是否被加载,如果没有被加载就要先加载这个类,加载这个类的时候会执行这个类的静态块;当加载完成以后,就检查这个类是否有父类,如果有父类就要执行父类的匿名块,然后执行父类的构造器;之后再执行本类的匿名块和本来的构造器。
父类静态块à子类静态块à父类匿名块à父类构造器à子类匿名块à子类构造器
package com.softeem.extent.lesson04_super;
class StaticDemo {
// 构造函数 ③
StaticDemo() {
System.out.println("构造函数 run..");
}
public void show() {
System.out.println("show run...");
// 局部代码块:按顺序执行 ④
{
System.out.println("局部代码块 run...");
}
}
// 构造代码块 ②
{
System.out.println("代码块 run...");
}
// 静态代码块 ①
static {
System.out.println("Static run....");
}
}
public class Test {
public static void main(String[] args) {
new StaticDemo().show();
System.out.println("***************");
new StaticDemo().show();
}
}
注意:静态代码块在多个类调用时只执行一次。
子父类中静态代码块和子类静态代码块
class Father {
// 父类静态代码块 ①
static {
System.out.println("父类静态代码块");
}
// 父类匿名代码块 ③ ⑦
{
System.out.println("父类匿名代码块");
}
// 父类构造函数 ④ ⑧
public Father() {
System.out.println("父类的构造器");
}
}
class Son extends Father {
// 子类静态代码块 ②
static {
System.out.println("子类静态代码块");
}
// 子类匿名代码块 ⑤ ⑨
{
System.out.println("子类匿名代码块");
}
// 子类构造函数 ⑥ ⑩
public Son() {
System.out.println("子类中的构造器");
}
}
public class Test {
public static void main(String[] args) {
new Son();
System.out.println("******************");
new Son();
}
}