16. 代码分析题:请分析父类与子类中的静态代码块,构造代码块,以及构造方法三者之间的运行机制

package com.fy;
/**
 *代码分析题:
 *  分析父类,子类中的静态代码块,构造代码块的运行机制
 * @author 江湖@小小白
 */
public class Test1 {
    
    

    public static void main(String[] args) {
    
    
        /**
         * 创建子类对象时的运行机制分析:
         * 1. 首先类子对象的创建,进行了类加载
         * 2. 在类加载时,执行静态代码块
         * 3. 因为子类继承父类,有一个默认的super()无参构造方法,此时调用父类中的无参构造方法
         * 4. 类加载时,优先执行静态代码块,因此会执行流程:
         *    父类的静态代码块 ——>子类的静态代码块 ——> 父类的构造代码块 ——> 父类的构造器 ——> 子类的构造代码块 ——> 子类的构造器
         */
        //Zi z = new Zi();

        /**
         * 创建对象,父类引用指向子类对象:
         * 1. 创建对象时,进行类加载;
         * 2. 类加载,执行静态代码块
         * 3. 执行父类的构造代码块
         * 4. 子类中默认super()方法,调用父类中的无参构造方法
         * 5. 执行子类中的方法
         */

        Fu f = new Zi();
    }

    static class Fu {
    
    

        static {
    
    

            System.out.println("父类的静态代码块");

        }

        {
    
    
            System.out.println("父类的构造代码块");
        }

        public Fu() {
    
    

            System.out.println("父类的构造器");
        }
    }

    static class Zi extends Fu {
    
    
        public Zi() {
    
    

            System.out.println("子类的构造器");

        }

        {
    
    
            System.out.println("子类的构造代码块");
        }

        static {
    
    

            System.out.println("子类的静态代码块");
        }
    }
}


情况1

情况2

猜你喜欢

转载自blog.csdn.net/zhu_fangyuan/article/details/108597500
今日推荐