参考:https://blog.csdn.net/kunlyy/article/details/52176305
Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。
代码的执行顺序
- 主调类的静态代码块
- 对象父类的静态代码块
- 对象的静态代码块
- 对象父类的非静态代码块
- 对象父类的构造函数
- 对象的非静态代码块
- 对象的构造函数
//主调类 package test; public class StaticBlockTest1 { //主调类的非静态代码块 { System.out.println("主调类的非静态代码块"); } //主调类的静态代码块 static { System.out.println("主调类的静态代码块"); } public StaticBlockTest1(){ System.out.println("主调类的无参构造"); } public static void main(String[] args) { Children children = new Children("zhan"); children.getValue(); } } //父类 package test; public class Parent { private String name; private int age; //父类无参构造方法 public Parent(){ System.out.println("父类无参构造方法"); { System.out.println("Parent constructor method--> not static block"); } } //父类的非静态代码块 { System.out.println("父类的非静态代码块"); name = "zhangsan"; age = 50; } //父类静态代码块 static { System.out.println("父类静态代码块"); } //父类有参构造方法 public Parent(String name, int age) { System.out.println("Parent constructor method"); this.name = "lishi"; this.age = 51; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } //子类 package test; class Children extends Parent{ //子类静态代码块 static { System.out.println("子类静态代码块"); } //子类非静态代码块 { System.out.println("子类非静态代码块"); } //子类无参构造方法 public Children(String str){ System.out.println("子类无参构造方法"); } public void getValue(){ //this.setName("lisi"); //this.setAge(51); System.out.println(this.getName() + this.getAge()); } }
主调类的静态代码块
父类静态代码块
子类静态代码块
父类的非静态代码块
父类无参构造方法
Parent constructor method--> not static block
子类非静态代码块
子类无参构造方法
zhangsan50