1、首先不考虑父类,只考虑本类的情况下,执行顺序为:
静态代码块|静态变量—>非静态代码块|实例变量—>构造函数
静态代码块和静态变量执行的先后顺序是代码的编写顺序,非静态代码块和实例变量的执行顺序同样也是代码编写的先后顺序
下面新建一个Parent类,通过代码示例说明:
public class Parent {
public static int i = 1;
static {
i = 4;
System.out.println("====静态代码块");
}
public Parent() {
i = 2;
System.out.println("====构造函数");
}
{
i = 3;
System.out.println("====非静态代码块");
}
public static void main(String[] args) {
System.out.println("======"+i);
new Parent();
System.out.println("======"+i);
}
}
代码输出结果:
====静态代码块
======4
====非静态代码块
====构造函数
======2
执行顺序非常明了
2、下面继续,存在父类的情况下的执行顺序:
父类静态代码块|父类静态变量—>子类静态代码块|子类静态变量—>父类非静态代码块|父类实例变量—>父类构造函数—>子类非静态代码块|子类实例变量—>子类构造函数
父类和子类中静态代码块和静态变量执行的先后顺序依旧是代码的编写顺序,非静态代码块和实例变量的执行顺序同样也是代码编写的先后顺序
下面新建一个Child类继承Parent类,通过代码示例说明:
public class Parent {
public static int i = 1;
static {
i = 4;
System.out.println("====父类静态代码块");
}
public Parent() {
i = 2;
System.out.println("====父类构造函数");
}
{
i = 3;
System.out.println("====父类非静态代码块");
}
}
class Child extends Parent{
public Child() {
i = 6;
System.out.println("######子类构造函数");
}
{
i = 7;
System.out.println("######子类非静态代码块");
}
static {
i = 8;
System.out.println("######子类静态代码块");
}
public static void main(String[] args) {
System.out.println("######i="+i);
new Child();
System.out.println("######i="+i);
}
}
执行结果如下:
====父类静态代码块
######子类静态代码块
######i=8
====父类非静态代码块
====父类构造函数
######子类非静态代码块
######子类构造函数
######i=6
3、总结:
1、类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)
2、父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类 的(变量、初始化块、构造器)
博客主要探讨类代码执行顺序。先分析不考虑父类,本类中静态代码块和变量先于非静态代码块、实例变量和构造函数执行,顺序按代码编写。接着阐述存在父类时,父类静态内容先执行,再到子类静态,然后是父类非静态和构造函数,最后是子类非静态和构造函数。
4554

被折叠的 条评论
为什么被折叠?



