(转)java类初始化顺序 - jackyrong的世界 - 博客园
- public class InitialOrderTest {
- // 静态变量
- public static String staticField = "静态变量";
- // 变量
- public String field = "变量";
- // 静态初始化块
- static {
- System.out.println(staticField);
- System.out.println("静态初始化块");
- }
- // 初始化块
- {
- System.out.println(field);
- System.out.println("初始化块");
- }
- // 构造器
- public InitialOrderTest() {
- System.out.println("构造器");
- }
- public static void main(String[] args) {
- new InitialOrderTest();
- }
- }
运行以上代码,我们会得到如下的输出结果:
- 静态变量
- 静态初始化块
- 变量
- 初始化块
- 构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
- class Parent {
- // 静态变量
- public static String p_StaticField = "父类--静态变量";
- // 变量
- public String p_Field = "父类--变量";
- // 静态初始化块
- static {
- System.out.println(p_StaticField);
- System.out.println("父类--静态初始化块");
- }
- // 初始化块
- {
- System.out.println(p_Field);
- System.out.println("父类--初始化块");
- }
- // 构造器
- public Parent() {
- System.out.println("父类--构造器");
- }
- }
- public class SubClass extends Parent {
- // 静态变量
- public static String s_StaticField = "子类--静态变量";
- // 变量
- public String s_Field = "子类--变量";
- // 静态初始化块
- static {
- System.out.println(s_StaticField);
- System.out.println("子类--静态初始化块");
- }
- // 初始化块
- {
- System.out.println(s_Field);
- System.out.println("子类--初始化块");
- }
- // 构造器
- public SubClass() {
- System.out.println("子类--构造器");
- }
- // 程序入口
- public static void main(String[] args) {
- new SubClass();
- }
- }
运行一下上面的代码,结果马上呈现在我们的眼前:
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
- public class TestOrder {
- // 静态变量
- public static TestA a = new TestA();
- // 静态初始化块
- static {
- System.out.println("静态初始化块");
- }
- // 静态变量
- public static TestB b = new TestB();
- public static void main(String[] args) {
- new TestOrder();
- }
- }
- class TestA {
- public TestA() {
- System.out.println("Test--A");
- }
- }
- class TestB {
- public TestB() {
- System.out.println("Test--B");
- }
- }
运行上面的代码,会得到如下的结果:
- Test--A
- 静态初始化块
- Test--B
转载于:https://www.cnblogs.com/yumo1627129/p/7137283.html
(转)java类初始化顺序 - jackyrong的世界 - 博客园相关推荐
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪 如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- java类初始化顺序_Java 类的初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行 执行顺序优先级:静态块,main(),构造块,构造方法 1. 构造函数 publi ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
构造函数 public HelloA(){//构造函数} 关于构造函数,以下几点要注意: 1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的. 2.构造函数的作用是 ...
- 面试题:Java类初始化顺序
1. 问题来源 你遇到过哪些质量很高的 Java 面试? - ZO01的回答 - 知乎 https://www.zhihu.com/question/60949531/answer/579002882 ...
- java 使用webmagic 爬虫框架爬取博客园数据
java 使用webmagic 爬虫框架爬取博客园数据存入数据库 学习记录 webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. ht ...
- 随机数是骗人的,.Net、Java、C为我作证 - 杨中科 - 博客园
移动端全链路跟踪保障体系 随机数是骗人的,.Net.Java.C为我作证 - 杨中科 - 博客园
- Java类初始化顺序(变量赋值与静态代码块的执行时间)
前言:最近写代码的时候经常见到见到static代码块,不由对static的执行时间产生了兴趣,进而对类初始化顺序产生了兴趣. 类从编译到执行的过程: 在使用ClassLoader将字节码转换为JVM中 ...
- 一文详解Java类初始化顺序
目录 一.普通类 二.包含继承关系 三.包含接口.抽象类关系 本文将介绍三种情形下的类初始化顺序. 一.普通类 Java类:Animal.java package ztt.继承接口多态.执行顺序测试; ...
- JAVA爬虫实践(实践二:博客园)
分析博客园网站的请求可以发现,博客园的分页请求为POST方式,和知乎的滚动加载类似. 不同的是请求响应返回的是HTML而不是JSON. 这样可以套用上一篇爬知乎的代码,需要修改的部分就是POST方法传 ...
最新文章
- Arithmetic
- android从放弃到精通第11天 勿忘初心
- VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
- Mongodb ruby driver API(中文)
- spring核心之AOP学习总结二
- JavaScript 里 window, document, screen, body 这几个名词的区别
- 在Matlab2006a中如何创建.net组件
- 黑客们的故事(连载三) 因为好奇
- ElasticSearch 核心概念介绍_02
- Java通过反射访问构造方法
- 《程序员面试宝典》精华 编程语言部分
- python二进制解码_使用python3对二进制数据进行编码和解码,以将其包含到JSON中...
- 亿图图示最新po解直装版(附教程)
- 从布朗运动、随机微积分到股票买卖
- 自定义video的controls(播放暂停按钮、进度条、快进快退等)
- 别再吐槽12306了!有本事你来写架构
- vue.jsv-if 的key值问题
- Java线程池的四种创建方式
- 运营管理模型对计算机软件,生产与运作管理
- 基于微信小程序的设备报修系统源码
热门文章
- Learning ROS: Service and Client (C++)
- ubuntu下载软件安装包
- linux cp 强制覆盖
- 【ios】Storyboard教程
- C#实现HTTP协议:多线程文件传输
- Quartz.NET 架构与源代码分析系列 part 2 :Job 作业
- [导入]LAMP架构下安装Drupal
- 海思Hi3519A 进行4k60 h264编码帧率不足的问题
- linux 正则表达式与实践
- mysql主从复制思考_Mysql主从复制(拓展博客文章分享及思考)