美文网首页
类和实例变量的初始化过程

类和实例变量的初始化过程

作者: ccUpUp | 来源:发表于2019-02-20 18:33 被阅读0次

    关于类和实例变量初始化过程,我们直接看代码来解释比较好理解。
    代码如下:

    public class Father{
        private int i = test();
        private static int j = method();
    
        static{
            System.out.print("(1)");
        }
        Father(){
            System.out.print("(2)");
        }
        {
            System.out.print("(3)");
        }
    
    
        public int test(){
            System.out.print("(4)");
            return 1;
        }
        public static int method(){
            System.out.print("(5)");
            return 1;
        }
    }
    
    public class Son extends Father{
        private int i = test();
        private static int j = method();
        static{
            System.out.print("(6)");
        }
        Son(){
    //      super();//写或不写都在,在子类构造器中一定会调用父类的构造器
            System.out.print("(7)");
        }
        {
            System.out.print("(8)");
        }
        public int test(){
            System.out.print("(9)");
            return 1;
        }
        public static int method(){
            System.out.print("(10)");
            return 1;
        }
        public static void main(String[] args) {
            Son s1 = new Son();
            System.out.println();
            Son s2 = new Son();
        }
    }
    

    执行结果如下:

    (5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
    (9)(3)(2)(9)(8)(7)
    

    我们根据程序执行结果来分析可以得知:

    类和实例变量的初始化过程:
    程序首先初始化父类,再初始化子类。
    具体初始化顺序如下:
    第一步首先初始化类
    1)静态实例变量
    2)静态代码块
    3)它俩谁在程序前边谁先执行
    第二步初始化类的实例变量
    1)初始化非静态变量
    2)非静态代码块
    3)它俩谁在程序前边谁先执行
    4)父构造器
    5)子构造器
    需要注意的是程序中的test()方法为重写的方法,Son对象在初始化时执行的是Son类里的test()方法。
    

    非静态方法前面其实有一个默认的对象this,this在构造器(或<init>)它表示的是正在创建的对象,因为这里是在创建Son对象,所以test()执行的是子类重写的代码(面向对象多态)。

    相关文章

      网友评论

          本文标题:类和实例变量的初始化过程

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