练习题------代码块

class Root {
  static {
    System.out.println("Root的静态初始化块");
  }

  {
    System.out.println("Root的普通初始化块");
  }

  public Root() {
    System.out.println("Root的无参数的构造器");
  }
}

class Mid extends Root {
  static {
    System.out.println("Mid的静态初始化块");
  }

  {
    System.out.println("Mid的普通初始化块");
  }

  public Mid() {
    System.out.println("Mid的无参数的构造器");
  }

  public Mid(String msg) {
    // 通过this调用同一类中重载的构造器
    this();
    System.out.println("Mid的带参数构造器,其参数值:" + msg);
  }
}

class Leaf extends Mid {
  static {
    System.out.println("Leaf的静态初始化块");
  }

  {
    System.out.println("Leaf的普通初始化块");
  }

  public Leaf() {
    // 通过super调用父类中有一个字符串参数的构造器
    super("尚硅谷");
    System.out.println("Leaf的构造器");
  }
}

public class LeafTest {
  public static void main(String[] args) {
    new Leaf();
  }
}

  其中LeafTest  测试类中进行测试    创建Leaf类的对象 由于存在继承关系,创建对象的顺序   Root--->  Mid ---->Leaf   ,静态代码块随着类的加载而执行 非静态代码块是创建对象的时候而执行的,所以执行代码,输出的效果为:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:尚硅谷
Leaf的普通初始化块
Leaf的构造器

原文地址:https://www.cnblogs.com/lxsfve/p/13274941.html