上一篇简单的介绍了一下静态代码块,构造代码块和构造方法的执行顺序问题。接下来我们接着这个问题往下研究。上一篇只是介绍了一下一个测试类和一个现实描述类的静态代码块,构造代码块和构造方法的执行顺序问题。这一篇,我们让这个现实描述类有继承关系,子父类中都有静态代码块,构造代码块,和构造方法,看他们的执行流程是怎样的。
[AppleScript] 纯文本查看 复制代码 package com.itheima;
public class Demo {
public static void main(String[] args) {
Monitor s = new Monitor();
}
}
class Student {
private String name;
private int age;
static{
System.out.println("我是Student静态代码块");
}
{
System.out.println("我是Student构造代码块");
}
public Student() {
System.out.println("我是Student无参构造");
}
public Student(String name, int age) {
System.out.println("我是Student有参构造");
this.name = name;
this.age = age;
}
}
class Monitor extends Student {
static{
System.out.println("我是Monitor静态代码块");
}
{
System.out.println("我是Monitor构造代码块");
}
public Monitor() {
System.out.println("我是Monitor无参构造");
}
public Monitor(String name, int age) {
super(name, age);
System.out.println("我是Monitor有参构造");
}
}
运行结果就是
[AppleScript] 纯文本查看 复制代码 我是Student静态代码块
我是Monitor静态代码块
我是Student构造代码块
我是Student无参构造
我是Monitor构造代码块
我是Monitor无参构造
之所以运行结果是这样的。是因为我们在加载类的时候先加载父类,再加载子类。所以先执行父类的静态代码块,再执行子类的静态代码块。在测试类中,我们使用无参构造创建的Monitor,所以会调用Monitor的无参构造,在Monitor的无参构造的第一行隐含了一个super(),所以会调用父类的无参构造,调用父类无参构造之前会先执行父类的构造代码块。所以后边的执行顺序是先执行父类的构造代码块和无参构造,再执行子类的无参构造。
我们接下来让情况稍微复杂一些。就是在子类中调用父类的构造方法,我们来看一下执行顺序是怎样的。我们在子类的无参构造中调用父类的有参构造
[AppleScript] 纯文本查看 复制代码 package com.itheima;
public class Demo {
public static void main(String[] args) {
Monitor s = new Monitor();
}
}
class Student {
private String name;
private int age;
static{
System.out.println("我是Student静态代码块");
}
{
System.out.println("我是Student构造代码块");
}
public Student() {
System.out.println("我是Student无参构造");
}
public Student(String name, int age) {
System.out.println("我是Student有参构造");
this.name = name;
this.age = age;
}
}
class Monitor extends Student {
static{
System.out.println("我是Monitor静态代码块");
}
{
System.out.println("我是Monitor构造代码块");
}
public Monitor() {
super("zhangsan",12);
System.out.println("我是Monitor无参构造");
}
public Monitor(String name, int age) {
super(name, age);
System.out.println("我是Monitor有参构造");
}
}
执行顺序是:
[AppleScript] 纯文本查看 复制代码 我是Student静态代码块
我是Monitor静态代码块
我是Student构造代码块
我是Student有参构造
我是Monitor构造代码块
我是Monitor无参构造
因为我们在子类的无参构造中调用了父类的有参构造,所以会执行到父类的有参构造。
|