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. 2023年ccpc大学生程序设计竞赛-crf

    第一次参加这种大型线下程序设计比赛,心情自然是很激动,但比赛中并没有想象中那么顺利,甚至可以说有些惊险,比赛开始的时候,我们三人随便看看题,顺便等着跟榜,对于签到题我们自然是相信clk可以很快地独立完 ...

  2. pe文件对齐

    PE中规定了三类对齐:数据在内存中的对齐. 数据在文件中的对齐.资源文件资源数据的对齐. 1.内存对齐 由于windows操作系统对内存属性的设置以也为单位,所以通常情况下,节在内存中的对齐单位必须至 ...

  3. 2021-8-5 Mysql个人练习题

    创建学校表格 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birt ...

  4. 获取Rtx用户状态方法

    背景:企业OA系统需要与Rtx集成,且高权限身份用户需要获取符合某一条下的所有员工rtx状态... 方案:以此背景,基于rtx sdk做二次开发, 1.后台调用RootObj.QueryUserSta ...

  5. Powe AutoMate: 条件判断语句

    大纲 学习使用条件判断语句 使用条件判断 功能描述 判断用户输入的年龄,并显示对应的信息 使用if 判断是否是未成年人: 使用else if 判断大于18岁,小于28岁的人群 运行效果 使用else ...

  6. 【Nacos篇】Nacos基本操作及配置

    官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html 前置条件:SpringCloud脚手架 单机模 ...

  7. python实现创建一个银行类,这个类实现了两个方法,第一个方法可以将用户信息写入到文件中,第二个方法可以读取文件中的用户信息出来

    class bank: def user_info(self): a=input('请输入用户信息:') # 不写encoding = 'utf-8'中文会乱码 with open('info.txt ...

  8. Hybrid App 技术路径带动性能的提升

    说到 Hybrid App(混合应用)大家都不陌生,因为这种开发模式大行其道发展的这些年取代了很多原生和 Web 应用,为什么大家对这种「Native + HTML5」的开发模式额外偏爱呢? 因为一方 ...

  9. 用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力

    本教程收集于:AIGC从入门到精通教程汇总 操作指引 ChatGPT产生文案=>腾讯智影数字人播报=>粘贴文案=>导出视频. 说明:部分资源只有会员才能用~,非会员可生成5分钟视频. ...

  10. Android13深入了解 Android 小窗口模式和窗口类型

    Android13深入了解 Android 小窗口模式和窗口类型 小窗模式,作为一种在移动设备上的多任务处理方式,为用户带来了便捷和高效的体验,尤其在一些特定场景下,其价值愈发凸显.以下是为什么需要小 ...