美文网首页
继承与初始化顺序问题

继承与初始化顺序问题

作者: Hope_加贝 | 来源:发表于2019-08-29 14:25 被阅读0次
    import static net.mindview.util.Print.*;
    class Insert{
        private int i = printInit(" Insert.i initialized");;
        protected int j;
        Insert(){
            print("i = "+i+", j ="+j);
            j = 39;
        }
        private static int x1 = printInit("Static Insert.x1 initialized");
        static int printInit(String s){
            print(s);
            return 47;
        }
    }
    
    public class  Beetle extends Insert{
        private int k = printInit("Beetle.k initialized");
        public Beetle(){
            print("k = "+k);
            print("j="+j);
        }
        private int h = printInit("Beetle.h initialized");
        private static int x2 = printInit("Static Beetle.x2 initialized");
        public static void main(String[] args){
            print("Beetle constructor");
            Beetle b = new Beetle();
            
        }
        
    }
    

    在Beetle上运行Java时,第一件事就是试图访问Beetle.main()(一个static方法),于是加载器开始启动并找出Beetle类的编译代码(在名为Beetle.calss的文件之中),对它进行加载的过程中,编译器注意到它有一个基类
    于是它继续进行加载,不管你是否打算产生一个该基类的对象,这都要发生。
    如果该基类还有自身的基类,那么仍会递归加载,根基类中的static初始化即会被执行,然后是下一个导出类,因为导出类的static初始化可能会依赖于基类成员能否被正确初始化。

    至此,必要的类已加载完毕,对象就可以被创建了,首先,对象中的所有基本类型都会被设为默认值,对象引用被设为null,然后基类的构造器会被调用。
    输出结果:

    Static Insert.x1 initialized
    Static Beetle.x2 initialized
    Beetle constructor
     Insert.i initialized
    i = 47, j =0
    Beetle.k initialized
    Beetle.h initialized
    k = 47
    

    相关文章

      网友评论

          本文标题:继承与初始化顺序问题

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