• 继承中代码的执行顺序


    在继承中代码的执行顺序为:1.父类静态对象和静态代码块   2.子类静态对象和静态代码块

                                         3.父类非静态对象和非静态代码块  4.父类构造函数

                                         5.子类非静态对象和非静态代码块  6.子类构造函数


    1.对于本题来说:在只想new Sub(5)的时候,父类先初始化了 int flag = 1,然后执行父类的构造函数Super(),父类构造函数中执行的test()方法,因子类是重写了test()方法的,因此父类构造函数中的test()方法实际执行的是子类的test()方法,所以输出为Sub.test() flag=1,接着执行子类构造函数Sub(5) 将flag赋值为5,因此输出结果Sub.Sub() flag=5。最终选择了A:Sub.test() flag=1 Sub.Sub() flag=5

    public class Demo { 
       class Super { 
            int flag=1; ①父类非静态对象
            Super(){    ②父类构造函数
                test();  ③子类是重写了test()方法的,因此父类构造函数中的test()方法实际执行的是子类的test()方法
            } 
            void test(){
                System.out.println("Super.test() flag="+flag);
            }
       }
       class Sub extends Super {
            Sub(int i){ ④子类构造函数
                flag=i;
                System.out.println("Sub.Sub()flag="+flag);
            } 
            void test(){  ③
                System.out.println("Sub.test()flag="+flag);
            }
        } 
        public static void main(String[] args) { 
            new Demo().new Sub(5);
        }
    }

    2.初始化类的时候,首先在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的0。所以加载时,对t1初始化为null,对static静态块做了初步的初始化,但是还未执行里面的代码。然后按照静态变量的初始化顺序,首先对t1进行具体的初始化,由于static静态块已经进行了初步的初始化,所以这时候是直接跳过这里的,所以首先输出 blockA,然后初始化t1后,执行到static静态块之后,再执行里面的内容,所以输出blockB,最后执行普通的初始化块blockA.   blockAblockBblockA

    类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)

    执行顺序优先级:静态块>main()>构造块>构造方法

    public class Test
    {
        public static Test t1 = new Test(); ①
        {
             System.out.println("blockA");  
        }
        static
        {
            System.out.println("blockB");  ②
        }
        public static void main(String[] args)
        {
            Test t2 = new Test();  ③
        }
     }
    在平凡中坚持前行,总有一天,会遇见优秀的自己
  • 相关阅读:
    Spring+Quartz实现文件中转站
    Velocity中的ComparisonDateTool、MathTool、NumberT...
    Adobe Flash Builder 4.7破解方法(绝对可用)
    12c weblogic需要输入用户名密码
    velocity+spring mvc+spring ioc+ibatis初试感觉(与struts+spring+hibernate比较)
    基于tomcat7 web开发中的一点小东西
    Positional parameter are considered deprecated; use named parameters or JPA-style positional parameters instead.
    spring service事务传播
    Spring注解方式实现任务调度【官方文档翻译】
    Tomcat 下 Memcached 集群与 Terracotta 集群比较
  • 原文地址:https://www.cnblogs.com/mao-19/p/7436262.html
Copyright © 2020-2023  润新知