eg.
/**
* @author Fly_Roushan
* @date 2020/11/12
*/
public class Person {
private String name;
private Integer age;
static {
System.err.println("Static Block -> Person");
}
{
System.err.println("Block -> Person");
}
public Person() {
this("Roushan", 18);
System.err.println("Constructor -> Person");
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
class Children extends Person {
private static Children person = new Children();
static {
System.err.println("Static Block -> Children");
}
{
System.err.println("Block -> Children");
}
public Children() {
System.err.println("Constructor -> Children");
}
public static void main(String[] args) {
new Children();
}
}
Result:
Static Block -> Person
Block -> Person
Constructor -> Person
Block -> Children
Constructor -> Children
Static Block -> Children
Block -> Person
Constructor -> Person
Block -> Children
Constructor -> Children
Note:
1.静态代码块只加载一次。
2.Java执行代码顺序是由上至下,当出现静态变量, 后出现静态代码块时, 优先加载静态变量。
3.在子类构造器中有个隐式的super()放在"第一行", 因此会先加载父类。
4.可以在构造函数里面调用本身其他的构造函数: this(a, b);
5.先加载代码块, 是因为在编译时, 代码块的内容会放到构造器中。
eg.
public Children() {
super();
System.err.println("Block -> Children");
System.err.println("Constructor -> Children");
}
如有不足,请多指教!