当前位置: 首页 > news >正文

Java初始化顺序

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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初始化顺序如图:

分类: Java&JVM

http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html

转载于:https://my.oschina.net/u/1397325/blog/214507

相关文章:

  • linux 生成随机密码
  • 线程创建
  • 测者的测试技术手册:智能化测试框架EvoSuite的一个坑以及填坑方法
  • cookie和session
  • Android EditText控件自动转换大小写,光标位置不跳位
  • Android aidl Binder框架浅析
  • 4.8_获取页面元素的内容_getTable
  • java框架学习日志-10(自定义类实现AOP)
  • 说一说飞机上的无线上网
  • C#中的线程池使用(一)
  • android实现图片识别的几种方法
  • 12月24日云栖精选夜读 | 刚刚,阿里开源首个深度学习框架 X-Deep Learning!
  • 微信智能开放平台
  • SqlServer如何获取存储过程的返回值
  • MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet http://my.csdn.net/21aspnet/message CSDN Five...
  • ES6系统学习----从Apollo Client看解构赋值
  • express.js的介绍及使用
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 技术发展面试
  • 使用common-codec进行md5加密
  • 数组的操作
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define 用法
  • $.each()与$(selector).each()
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)fread与fwrite详解
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .NET : 在VS2008中计算代码度量值
  • .net 4.0发布后不能正常显示图片问题
  • .NET Project Open Day(2011.11.13)
  • .NET 服务 ServiceController
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net环境下的缓存技术介绍
  • .NET业务框架的构建
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .NET中统一的存储过程调用方法(收藏)
  • @AliasFor注解
  • @PreAuthorize注解
  • [14]内置对象
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [20190401]关于semtimedop函数调用.txt
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]类和对象【下】
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [docker] Docker的私有仓库部署——Harbor
  • [ffmpeg] av_opt_set 解析
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [HJ73 计算日期到天数转换]
  • [iOS]-UIKit