单个类的情况:
先上代码
public class Ext {
static{
System.out.println("我是静态代码块1~");
}
{
System.out.println("我是非静态代码块1~");
}
static{
System.out.println("我是静态代码块2~");
}
{
System.out.println("我是非静态代码块2~");
}
public Ext() {
System.out.println("我是构造函数~");
}
public static void hello(){
System.out.println("我是静态非main方法~");
}
public static void main(String[] args) {
System.out.println("我是main方法~");
new Ext();
}
public void get() {
System.out.println("我是get方法~");
}
}
运行结果是:
我是静态代码块1~
我是静态代码块2~
我是main方法~
我是非静态代码块1~
我是非静态代码块2~
我是构造函数~
结论:
总体上顺序是:静态代码块->非静态代码块->构造方法
而且,后两个是在实例化时执行的。同样都是静态代码块的话顺序执行,非静态代码块也是。
如果把main方法改成
public static void main(String[] args) {
new Ext();
System.out.println("我是main方法~");
}
结果是:
我是静态代码块1~
我是静态代码块2~
我是非静态代码块1~
我是非静态代码块2~
我是构造函数~
我是main方法~
————————华丽的分割线—————————-
有类继承时的情况:
代码来一套:
class ExtA{
static{
System.out.println("我是父类的静态代码块~");
}
{
System.out.println("我是父类的非静态代码块~");
}
public ExtA() {
System.out.println("我是父类的构造函数~");
}
}
public class ExtB extends ExtA{
static{
System.out.println("我是子类的静态代码块~");
}
{
System.out.println("我是子类的非静态代码块~");
}
public ExtB() {
System.out.println("我是子类的构造函数~");
}
public static void main(String[] args) {
System.out.println("我是子类的main方法~");
new ExtB();
}
}
运行结果:
我是父类的静态代码块~
我是子类的静态代码块~
我是子类的main方法~
我是父类的非静态代码块~
我是父类的构造函数~
我是子类的非静态代码块~
我是子类的构造函数~
结论:
不多解释了,看运行结果很明显了吧
嗯,层次很清楚。无非就是先执行父类的再执行子类的,注意一下红色标注部分就行了。