zoukankan      html  css  js  c++  java
  • Android(java)学习笔记78:Java类初始化顺序

    1. Java类中初试化的顺序:

    由此得出Java普通类初始化顺序结论:

    (1)静态变量

    (2)静态初始化块

    (3)变量

    (4)初始化块

    (5)构造器

    由此得出Java继承类初始化顺序结论:
    (1)继承体系的所有静态成员初始化(先父类,后子类)
    (2)父类初始化完成(普通成员的初始化-->构造函数的调用)
    (3)子类初始化(普通成员-->构造函数)
     
     
    2. Java初始化顺序如图:
     
    代码演示:
    class Sample
    {
          Sample(String s)
          {
                System.out.println(s);
          }
     
          Sample()
          {
                System.out.println("Sample默认构造函数被调用");
          }
    }
     
    class Test{
          static Sample sam=new Sample("静态成员sam初始化");
     
          Sample sam1=new Sample("sam1成员初始化");
     
          static{
                    System.out.println("static块执行");
                    if(sam==null)
              System.out.println("sam is null");
                    sam=new Sample("静态块内初始化sam成员变量");
                 }
     
          Test()
          {
                System.out.println("Test默认构造函数被调用");
          }
     
    }
     
    //主函数
     public static void  main(String  str[])
    {
         Test a=new Test();
     }
    输出结果为:
    静态成员sam初始化             -----静态成员初始化
    static块执行                   -----静态块被执行
    静态块内初始化sam成员变量       -----静态块执行
    sam1成员初始化                          -----普通成员初始化
    Test默认构造函数被调用                -----构造函数执行
     
     
    由此可以得出结论
    a.  静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)
    b.  普通成员初始化
    c.  执行构造函数。
     
    对于静态成员(static块可以看成普通的一个静态成员,其并不一定在类初始化时首先执行)和普通成员,其初始化顺序只与其在类定义中的顺序有关,和其他因素无关。
    例如下面的例子:
     
     
    class Test{
          static{
                  System.out.println("static 块 1  执行");
                }
     
          static Sample staticSam1=new Sample("静态成员staticSam1初始化");
     
          Sample sam1=new Sample("sam1成员初始化");
     
          static Sample staticSam2=new Sample("静态成员staticSam2初始化");
     
          static{
                  System.out.println("static 块 2  执行");
                }
     
          Test()
          {
                System.out.println("Test默认构造函数被调用");
          }
          Sample sam2=new Sample("sam2成员初始化");
     
    }
     
     
    则结果为:
    static 块 1  执行
    静态成员staticSam1初始化
    静态成员staticSam2初始化
    static 块 2  执行 
                          --------静态成员
    sam1成员初始化
    sam2成员初始化
                          --------普通成员
    Test默认构造函数被调用
                          --------构造函数
     
     
    3. Java继承情况下的初始化顺序:
     
    class Test{
          static{
                  System.out.println("父类static 块 1  执行");
                }
     
          static Sample staticSam1=new Sample("父类 静态成员staticSam1初始化");
     
          Sample sam1=new Sample("父类 sam1成员初始化");
     
          static Sample staticSam2=new Sample("父类 静态成员staticSam2初始化");
     
          static{
                  System.out.println("父类 static 块 2  执行");
                }
     
          Test()
          {
                System.out.println("父类 Test默认构造函数被调用");
          }
          Sample sam2=new Sample("父类 sam2成员初始化");
     
    }
     
    class TestSub extends Test
    {
          static Sample staticSamSub=new Sample("子类 静态成员staticSamSub初始化");
     
          TestSub()
          {
                System.out.println("子类 TestSub 默认构造函数被调用");
          }
     
          Sample sam1=new Sample("子类 sam1成员初始化");
     
          static Sample staticSamSub1=new Sample("子类 静态成员staticSamSub1初始化");
          
          static{System.out.println("子类 static 块  执行");}
     
          Sample sam2=new Sample("子类 sam2成员初始化");
    }
     
    执行结果:
    父类 static 块 1  执行
    父类 静态成员staticSam1初始化
    父类 静态成员staticSam2初始化
    父类 static 块 2  执行
                            --------父类静态成员初始化
    子类 静态成员staticSamSub初始化
    子类 静态成员staticSamSub1初始化
    子类 static 块  执行
                            -------子类静态成员初始化
    父类 sam1成员初始化
    父类 sam2成员初始化
    父类 Test默认构造函数被调用       
                            -------父类普通成员初始化和构造函数执行
    子类 sam1成员初始化
    子类 sam2成员初始化
    子类 TestSub 默认构造函数被调用
                            -------父类普通成员初始化和构造函数执行
  • 相关阅读:
    判断平面的一堆点是否在两条直线上
    约数的个数 + 贪心
    划分树板子
    如何获取前端提交来得json格式数据
    post 和php://input 转
    使用Guzzle执行HTTP请求
    redis集群搭建 不用ruby
    systemctl命令
    canal 配置 多个监听 推送到不同mq
    canal 整合RabbitMQ
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4684501.html
Copyright © 2011-2022 走看看