A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

    上一篇简单的介绍了一下静态代码块,构造代码块和构造方法的执行顺序问题。接下来我们接着这个问题往下研究。上一篇只是介绍了一下一个测试类和一个现实描述类的静态代码块,构造代码块和构造方法的执行顺序问题。这一篇,我们让这个现实描述类有继承关系,子父类中都有静态代码块,构造代码块,和构造方法,看他们的执行流程是怎样的。
[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无参构造

因为我们在子类的无参构造中调用了父类的有参构造,所以会执行到父类的有参构造。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马