Android代码块执行顺序总结

96
奔跑吧李博
2017.12.18 15:37* 字数 399

子类、父类变量,代码块,以及构造方法的加载顺序,是我们在程序开发中时不时遇到的一个问题,也是比较容易混淆的。

基础准备:

变量: 成员变量(叫类变量、实例变量)和局部变量
方法: 成员方法和构造方法
代码块:普通代码块、构造代码块、静态代码块、同步代码块

测试的父类:

public class ParentClass {
    public static String name = "爸爸";
    public int age = 40;

    public ParentClass(){
        System.out.println("父类构造函数");
    }

    //非静态代码块
    {
        System.out.println("父类非静态代码块" + "---" + age);
    }

   //静态代码块
    static{
        System.out.println("父类静态代码块" + "---" + name);
    }

}

测试的子类:

public class ChildrenClass extends ParentClass{
    public static String name = "儿子";
    public int age = 15;

    public ChildrenClass(){
        System.out.println("子类构造函数");
    }

    {
        System.out.println("子类非静态代码块" + "---" + age);
    }

    static {
        System.out.println("子类静态代码块" + "---" + name);
    }

}
执行new ChildrenClass()结果:
image.png
结果分析:

父类静态代码块执行前,父类静态变量就已经执行了。
父类非静态代码块执行前,父类非静态变量就已经执行了。
上面结论子类同理。

代码块执行顺序总结:

父类的静态成员变量—->父类静态代码块—->子类静态成员变量—->子类静态代码块—>父类非静态变量—->父类非静态代码块—->父类构造方法—->子类非静态变量—->子类非静态代码块—->子类构造方法。

另外关于代码块的总结:
  1. 在类第一次调用时,静态代码块只执行这一次。
  2. 静态代码块和静态方法只能调用静态变量,因为它们执行时非静态变量还没初始化;
  3. 非静态代码块和非静态方法可以调用任何(静态+非静态)变量。
Android面试题
Web note ad 1