1  无继承情况下的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默认构造函数被调用
                      --------构造函数
2 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 默认构造函数被调用
                        -------子类普通成员初始化和构造函数运行
由此得出Java初始化顺序结论:
1 继承体系的全部静态成员初始化(先父类,后子类)
2 父类初始化完毕(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
Java初始化顺序如图:

Javaamp;amp;(面试题)初始化顺序总结相关推荐

  1. 性能优化|解读面试题,彻底搞懂类加载和初始化顺序

    解读面试题,彻底搞懂类加载和初始化顺序 在高级面试过程中,始终逃不过面试官的追问三连: 你知道jvm是怎么加载类的么? 类的初始化顺序你有了解么? 我出一个面试题,你能答出来么? 三连问下来,恐怕自己 ...

  2. java类初始化顺序-阿里笔试题

    阿里笔试题之写出程序输出结果: package com.patrick.bishi;public class TestVar {public static int k = 0;public stati ...

  3. 面试题:Java类初始化顺序

    1. 问题来源 你遇到过哪些质量很高的 Java 面试? - ZO01的回答 - 知乎 https://www.zhihu.com/question/60949531/answer/579002882 ...

  4. java 面试题解惑一 类的初始化顺序

    大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...

  5. C++成员变量的初始化顺序问题

    C++成员变量的初始化顺序问题 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy  print? class A { private: int n ...

  6. C++成员变量初始化顺序问题

    由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy  print? class A { private: int n1; int n2; publi ...

  7. [面试] C++ 语法(一) —— 初始化列表的初始化顺序

    首先来看一道经典的 C++ 面试题: (1)初始化列表的初始化顺序:不是按照列表的顺序进行的 (2)初始化列表的初始化顺序:是按照内存模型中的成员变量的顺序(也即类声明的定义顺序)进行的: (3)也即 ...

  8. 细节决定成败之C++成员变量、构造函数初始化顺序

    笔试题 class Runnable { protected:Runnable () : thread(NULL) {pthread_create(&thread, NULL, Runnabl ...

  9. java基础之——类的初始化顺序(转载)

    原文地址:http://www.cnblogs.com/chrischennx/p/3612295.html 由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米: 静态成员变量.静态代码块.普 ...

最新文章

  1. 基于SSM实现网上购物商城系统
  2. r语言 plot_R和Python的特点对比,这样你就知道该怎么选择了
  3. java web modules_使用Java web工程建立Maven Web Module工程
  4. 用户态和内核态的理解和区别
  5. 设计模式中的那些工厂
  6. mysql编码丢了_记住:永远不要在 MySQL 中使用 UTF-8
  7. Ubuntu自带简易录屏工具
  8. PAT乙级1028 人口普查 (20 分)
  9. scipy.sparse、pandas.sparse、sklearn稀疏矩阵的使用
  10. vue 多层双层全选_vue多级复杂列表展开/折叠,全选/分组全选实现
  11. 手心输入法漏洞绕过win8登陆验证
  12. deepin linux连接不上网络,把Deepin升级到15.8桌面版后无线上不了网的解决方法
  13. 西门子PLC学习笔记十-(计数器)
  14. 无法打开这个应用,查看Microsoft store, 了解有关Nahimic的详细信息
  15. Linux U盘分区格式化 fdisk命令
  16. 给你的SpringBoot工程打的jar包瘦瘦身
  17. 【选择恐惧症】接口?虚基类?
  18. 多线程的40个面试题总结(上)
  19. 信息学奥赛一本通:1179:奖学金
  20. window.print()打印时根据页面高度设置居中显示、设置打印布局(纵向、横向)

热门文章

  1. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
  2. TFS数据库变成可疑状态的处理
  3. 在网上找了一些j2ee的视频教程,有需要的朋友可以看看
  4. Win64 驱动内核编程-14.回调监控文件
  5. 汇编 头文件 依赖库文件
  6. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
  7. 【错误记录】VMware 虚拟机报错 ( 向 VMWare 虚拟机中的 Ubuntu 系统拷贝文件时磁盘空间不足 )
  8. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质 | 证明过程 )
  9. 【数字信号处理】相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )
  10. 【EventBus】EventBus 使用示例 ( 最简单的 EventBus 示例 )