Java 类成员的初始化顺序

前言:开发中碰到一个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初始化顺序为:

a 继承体系的所有静态成员初始化(先父类,后子类)

b父类初始化完成(普通成员的初始化-->构造函数的调用)

c 子类初始化(普通成员-->构造函数)

 

 

Java初始化顺序如图:

 

参考文献:

Java初始化顺序

Java 类成员的初始化顺序的更多相关文章

  1. Java中类成员变量初始化顺序

    一. 定义处默认初始化vs构造函数中初始化 java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子 public class FieldsInit { p ...

  2. Java类的变量初始化顺序

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

  3. java类中元素初始化顺序

    结论:对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. public class Test4 { @Tes ...

  4. java类及实例初始化顺序

    1.静态变量.静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只在类加载时,初始化一次) 2.非静态变量.非静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只要 ...

  5. java类对象的初始化顺序

    在下面这个例子中,我们分别在父类和子类中测试了静态代码块.普通代码块.静态成员变量.普通成员变量.构造器.静态内部类. 一:代码块及变量测试 class Field{ public static St ...

  6. c++ 类成员的初始化顺序

    class TestClass1 { public: TestClass1() { cout << "TestClass1()" << endl; } Te ...

  7. java类中元素初始化顺序详解

    父类静态变量父类静态块子类静态变量子类静态块父类普通变量父类普通块父类构造方法子类普通变量子类普通块子类构造方法

  8. java类中成员的初始化顺序(一)

    类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 ...

  9. java中的多构造函数以及类字段的初始化顺序

    1.同一个类可以有多个构造函数,多个构造函数之间通过参数来区分.这是方法重载的一个实例.构造函数之间可以相互调用. 2.类的初始化块:可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员. ...

随机推荐

  1. 项目优化经验分享(八)TeamLeader经验总结

    引言 通过前面的七篇博客.我把自己在项目优化过程的经验进行了分享,今天这篇博客,作为一个总结,就来讲讲作为一个TeamLeader,在项目管理中遇到的问题和解决经验! 正文 问题一:团队之间怎么沟通? ...

  2. iOS开发——语法OC篇&Block回顾

    Block回顾 这里知识简单介绍一下关于Block的语法,如果你觉得这里很简单或者想学习更深入的的使用清查看记者之前写的使用block传值和高级Block使用: http://www.cnblogs. ...

  3. 用systemtap对sysbench IO测试结果的分析1

    http://www.actionsky.com/docs/archives/171  2016年5月6日  黄炎 近期在一些简单的sysbench IO测试中, 遇到了一些不合常识的测试结果. 从结 ...

  4. 如何使用strace+pstack利器分析程序性能

    http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html

  5. NULL、NUL、‘\0’、0以及EOF

    0 is an integer constant, '\0' is a character constant, nul is the name of the character constant. N ...

  6. OC 实现的几个排序算法

    和在VC++6.0里相比 在OC里面实现 不算困难 可是我用惯了C/C++呢 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序 /******************** ...

  7. C#中怎么在EXCEL中的单元格中画斜线啊 ??

    Code Snippet 做法: 1,先添加引用COM,找 Excel 2,using Excel = Microsoft.Office.Interop.Excel; 3, 代码 private Ex ...

  8. leetcode题解: Remove Duplicates from Sorted List(已排序单链表去重)

    题目: Given a sorted linked list, delete all duplicates such that each element appear only once. For e ...

  9. 《Cortex-M0权威指南》之体系结构---嵌套中断控制器(NVIC)

    转载请注明来源:cuixiaolei的技术博客 为了管理中断请求的优先级并处理其他异常,Cortex-M0处理器内置了嵌套中断控制器(NVIC).NVIC的一些可编程控制器控制着中断管理功能,这些寄存 ...

  10. Django升级1.6之后出现“Bad Request (400)”错误的解决方案

    Django从1.4升级到1.6之后发现之前的网站都无法访问了,会出现“Bad Request (400)”的错误,搜了半天终于找到了解决办法. 解决方法很简单: 在settings.py里面添加: ...