美文网首页java
类加载、类初始化、创建对象、对象初始化顺序

类加载、类初始化、创建对象、对象初始化顺序

作者: 一颗浪星 | 来源:发表于2020-12-27 15:21 被阅读0次

    先来看一段代码:

    public class Father {
        int ii;
        static int fsi = 4;
    
        {
            System.out.println("4 father");
        }
    
        static {
            System.out.println("5 father");
        }
    
        public Father() {
            ii = 1;
            System.out.println("6 father");
        }
    
        static Son son = new Son();
    }
    public class Son extends Father {
        private int i = 1;
        private long l = 2L;
        static int ssi = 3;
    
        {
            System.out.println("1 Son");
        }
    
        static {
            System.out.println("2 Son");
        }
    
        public Son() {
            l=3L;
            System.out.println("3 Son");
        }
    }
    public class Init {
    
        public static void main(String[] args) {
            Son son = new Son();
        }
    }
    
    答案在文末

    以前也是懵里懵懂,答得总是不对,今天看了下面文章才算是真的明白了吧。
    https://blog.csdn.net/dingshuo168/article/details/102691891

    上面的题是对原文章的题做了一丢丢变化,也就是 Parent 中的 static Son son = new Son(); 调换了位置。

    以防上面的文章失效,记录下结论

    1.static 变量初始化代码和代码块中的代码,在类初始化这步按照在代码中书写的顺序被执行,非 static 同理。

    2.javac编译实现:

    • javac 编译器生成一个 <clinit> 方法,把“静态变量的初始化语句”和“static代码块语句”按照代码中的顺序编译到 <clinit> 方法中;
    • javac 编译器把“实例变量的初始化语句”和“实例代码块的语句”按照代码中的顺序编译到了构造方法中;

    3.原文中的结果:初始化对象的代码比静态的更早执行,我一直无法理解。也就是 static Son son = new Son() 这句代码。后来理解了:说白了,类初始化就是JVM执行代码的过程

    也就是那句代码相当于执行原文下图的 1、2。


    image.png

    执行结果为:
    5 father
    4 father
    6 father
    1 Son
    3 Son
    2 Son
    4 father
    6 father
    1 Son
    3 Son

    相关文章

      网友评论

        本文标题:类加载、类初始化、创建对象、对象初始化顺序

        本文链接:https://www.haomeiwen.com/subject/ytuonktx.html