Java初始化顺序

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初始化顺序如图:
 
 
使用Spring情况下初始化
 
bean文件:knight.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
5
6 <!-- BraveKnight bean,id为knight -->
7 <bean id="knight" class="spring.one.BraveKnight">
8 <!-- 构造参数,引用 id为quest的bean -->
9 <constructor-arg ref="quest"/>
10 </bean>
11
12
13 <!-- &lt;!&ndash; BraveKnight bean,id为knight &ndash;&gt;
14 <bean id="cowardlyKnight" class="spring.one.CowardlyKnight">
15 &lt;!&ndash; 构造参数,引用 id为quest的bean &ndash;&gt;
16 <constructor-arg ref="quest"/>
17 </bean>-->
18
19 <!-- SlayDragonQuest bean,id为quest -->
20 <bean id="quest" class="spring.one.SlayDragonQuest">
21 <!-- 构造参数,值为 #{T(System).out} -->
22 <constructor-arg value="#{T(System).out}"/>
23 </bean>
24
25 <!-- Minstrel bean, id为minstrel -->
26 <bean id="minstrel" class="spring.one.Minstrel">
27 <!-- 构造参数,值为 #{T(System).out} -->
28 <constructor-arg value="#{T(System).out}" />
29 </bean>
30
31 <aop:config>
32 <aop:aspect ref="minstrel">
33 <aop:pointcut id="embark" expression="execution(* *.embarkOnQuest(..))"/>
34 <aop:before method="singBeforeQuest" pointcut-ref="embark" />
35 <aop:after method="singAfterQuest" pointcut-ref="embark" />
36 </aop:aspect>
37 </aop:config>
38
39
40 </beans>

// main函数所在类

打了断点后执行顺序为: 4——>5——>1——>2——>6,说明执行ClassPathXmlApplicationContext载入Spring配置文件的时候已经完成了类的初始化

 

Java初始化顺序及使用Spring情况下初始化的更多相关文章

  1. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  2. java 23种设计模式,一般情况下,常用的有哪些? 转载

    原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...

  3. Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

    1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...

  4. 【Java疑难杂症】有return的情况下try catch finally的执行顺序

    有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...

  5. Java中 +=是什么意思 什么情况下用

    x+=1与x=x+1一样的效果执行一次x=x+1,就等于给x重新赋了值,这个值就是x+1例如:int x=1;x+=1;最后x的值是2x+=1一般在循环下使用,能发挥它的最大的作用.例如:while( ...

  6. Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?

    懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...

  7. Spring-boot中使用@ConditionalOnExpression注解,在特定情况下初始化bean

    想要实现的功能: 我想在配置文件中设置一个开关,enabled,在开关为true的时候才实例化bean,进行相关业务逻辑的操作. 具体实现: 1:要实例化的bean 2. 配置类 代码: 想要实例化的 ...

  8. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

  9. java类静态域、块,非静态域、块,构造函数的初始化顺序

    原文:http://ini.iteye.com/blog/2007835 面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有 ...

  10. Java中的static修饰int值做全局变量与static修饰词初始化顺序

    先看一道题 public class HasStatic{ private static int x=100; public static void main(String args[]){ HasS ...

随机推荐

  1. 用 Rust 生成 Ant-Design Table Columns

    经常开发表格,是不是已经被手写Ant-Design Table的Columns整烦了? 尤其是ToB项目,表格经常动不动就几十列.每次照着后端给的接口文档一个个配置,太头疼了,主要是有时还会粘错就尴尬 ...

  2. 2022-1-10 控件学习1 TextBlock、Lable、TextBox

    TextBlock LineBreak:在指定位置手动换行和<br/>类似 TextTrimming: CharacterEllipsis没有足够空间时显示...,WordEllpsis以 ...

  3. Ubuntu 用户的切换

    1.普通用户转成root su root 输入密码 确认密码(此时root账户已经建立) 2. root 转回 普通用户 su  用户名

  4. [ABC132D] Blue and Red Balls

    2023-01-16 题目 题目传送门 翻译 翻译 难度&重要性(1~10):3 题目来源 AtCoder 题目算法 dp 解题思路 因为蓝球的数量是固定的,题目让我们求,在取 \(i\) 次 ...

  5. c# .NET 高级编程 高并发必备技巧(二) - 分布式锁

    上一篇文章简单的介绍了单机的情况下如何进行加锁,防止高并发带来的问题. 然而现实中,一般会高并发的应用,很少会单机部署.当用户量达到一定的程度,分布式.集群部署是必然的选择.在分布式部署的情况下,之前 ...

  6. Redis系列20:LFU内存淘汰算法分析

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  7. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  8. 小知识:PPT的幻灯片放映设置

    最近给某客户讲课时,碰到了幻灯片自动翻页的情况,发现是因为之前做过粗略的计时演练,有些片子就快速过了. 问题现象: 结果导致放映时也出现了某些片子快速被自动翻页. 解决方案: 设置成手动推进幻灯片的方 ...

  9. 一文搞懂 OTP 双因素认证

    GitHub 在 2023 年 3 月推出了双因素认证(two-factor authentication)简称 2FA,并且承诺所有在 GitHub 上贡献的开发者在 2023 年底前启用双因素认证 ...

  10. Modbus动态链接库供多语言使用 | Go

    Modbus协议控制动态链接库 应用场景 基于各门语言都有各自的modbus协议库,且良莠不齐,而且在具体的框架下可能存在版本依赖问题, 而且对modbus协议存在比较多的细节处理,可以查看modbu ...