• new 对象时的暗执行顺序


    为什么称为暗执行顺序,因为当我们在new 对象时,其不是简简单单的new一个完事,它要首先检查父类的,静态的,非静态的等代码,就好像我们结婚生孩子一样,要先到祖宗那里,公安局那里,左邻右舍那里,告诉他们,我们要结婚了.下面来看其本质:

    这里有一个父类一个子类:

    class Father{
    {
    System.out.println("父类非静态代码块");
    }
    static{
    System.out.println("父类静态代码块");
    }
    public Father(){
    System.out.println("父类构造器");
    }
    public static void method(){
    System.out.println("父类静态方法");
    }
    public void method2(){
    System.out.println("父类非静态方法");
    }
    }

    class Son extends Father{
    {
    System.out.println("子类非静态代码块");
    }
    static{
    System.out.println("子类静态代码块");
    }
    public Son(){
    System.out.println("子类构造器");
    }
    public static void method(){
    System.out.println("子类静态方法");
    }
    public void method2(){
    System.out.println("子类非静态方法");
    }
    }

    当new Son()时,会打印:

      父类静态代码块
      子类静态代码块
      父类非静态代码块
      父类构造器
      子类非静态代码块
      子类构造器

    可能你会总结出这样的规律:先父后子,先静态后非静态最后才是构造器,但这是不准确的,因为按这个原则还有一种执行顺序:

      父类静态代码块
      父类非静态代码块
      父类构造器

      子类静态代码块
      子类非静态代码块
      子类构造器

    所以观察了细微问题后,对规律再做总结,就像我们写论文一样,用目录层级完美诠释它们的执行顺序:

    1.静态代码块:

      1.1 父的

      1.2 子的

    2.父其他

      2.1 父非静态代码块

      2.2 父构造器

    3.子其他

      3.1 子非静态代码块

      3.2 子构造器

    即:总体原则是静态代码块--->父其他--->子其他.

    你记住了吗?



  • 相关阅读:
    点击图片跳转详情
    offsetwidth/clientwidth的区别
    css中让元素隐藏的多种方法
    js中的||、&&与!用法
    怎么区分静态网页和动态网页
    我的第一篇博客--新手勿喷
    2015腾讯暑期实习生面试
    ring0 与 ring3 层之间的交互
    驱动层得到进程的完整路径
    WinDbg调试流程的学习及对TP反调试的探索
  • 原文地址:https://www.cnblogs.com/wangxuejian/p/10425704.html
Copyright © 2020-2023  润新知