构造函数、静态代码块和普通代码块的执行顺序
类加载的时候执行【静态代码块】 new对象的时候先执行【普通代码块】再执行【构造代码块】 每次new对象都会执行普通代码块。测试如下:
class Code{
public Code() {
System.out.println("构造方法--------Code");
}
{
System.out.println("构造块--------Code");
}
static {
System.out.println("静态代码块--------Code");
}
}
public class CodeBlock {
{
System.out.println("构造块--------CodeBlock");
}
static {
System.out.println("静态代码块--------CodeBlock");
}
public CodeBlock() {
System.out.println("构造方法--------CodeBlock");
}
public static void main(String[] args) {
System.out.println("main开始执行---------------------------");
new Code();
new Code();
new CodeBlock();
}
}
运行结果:
/*
静态代码块--------CodeBlock
main开始执行---------------------------
静态代码块--------Code
构造块--------Code
构造方法--------Code
构造块--------Code
构造方法--------Code
构造块--------CodeBlock
构造方法--------CodeBlock
*/
有继承关系的构造函数、静态代码块和普通代码块的执行顺序
类加载的时候先调用父类静态代码块,子类在创建对象的时候会先调用父类的普通构造代码块和构造函数(并不会创建父类对象)。
class Father{
public Father() {
System.out.println("构造方法--------------father");
}
{
System.out.println("普通代码块--------------father");
}
static {
System.out.println("静态代码块--------------father");
}
}
class Son extends Father{
public Son() {
System.out.println("构造方法--------------son");
}
{
System.out.println("普通代码块--------------son");
}
static {
System.out.println("静态代码块--------------son");
}
}
public class Main {
public static void main(String[] args) {
System.out.println("main函数开始");
new Son();
}
}
运行结果:
main函数开始
静态代码块--------------father
静态代码块--------------son
普通代码块--------------father
构造方法--------------father
普通代码块--------------son
构造方法--------------son