对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

package InitialOrder;

/**
* JAVA 初始化顺序
* @author Administrator
* 初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)> 构造器。
*/ public class InitialOrderTest { // 静态变量
public static String staticField = "静态变量";
// 变量
public String field = "变量"; // 构造器
public InitialOrderTest() {
System.out.println("构造器");
} // 初始化块
{
System.out.println(field);
System.out.println("初始化块");
} // 静态初始化块
static {
System.out.println(staticField);
System.out.println("静态初始化块");
} public static void main(String[] args) {
new InitialOrderTest();
}
/**
* 输出结果为:
* 静态变量
* 静态初始化块
* 变量
* 初始化块
* 构造器
*/
}

  对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

package InitialOrder;

class Parent {

    // 静态变量
public static String p_StaticField = "父类--静态变量";
// 变量
public String p_Field = "父类--变量"; // 构造器
public Parent() {
System.out.println("父类--构造器");
} // 初始化块
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
} // 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
} /**
* 对于继承情况下,静态变量、静态初始化块、变量、初始化块、构造器的执行顺序是什么样的呢?
* @author Administrator
* 并不是父类完全初始化完毕后才进行子类的初始化,
* 实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
*
*/
public class SubClass extends Parent {
// 静态变量
public static String s_StaticField = "子类--静态变量";
// 变量
public String s_Field = "子类--变量"; // 构造器
public SubClass() {
System.out.println("子类--构造器");
} // 初始化块
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
} // 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
} // 程序入口
public static void main(String[] args) {
new SubClass();
}
/**
* 输出结果:
* 父类--静态变量
* 父类--静态初始化块
* 子类--静态变量
* 子类--静态初始化块
* 父类--变量
* 父类--初始化块
* 父类--构造器
* 子类--变量
* 子类--初始化块
* 子类--构造器
*/
}

  现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

  那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明:

package InitialOrder;

class TestA {
public TestA() {
System.out.println("Test--A");
}
} class TestB {
public TestB() {
System.out.println("Test--B");
}
} /**
* 对于静态变量与静态初始化块的执行顺序
* @author Administrator
* 静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。
* 同样,变量和初始化块也遵循这个规律。
*/
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();
}
/**
* 输出结果:
* Test--A
* 静态初始化块
* Test--B
*/
}

  大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。

参考资料:

http://my.oschina.net/leoson/blog/103251

JAVA变量的执行顺序的更多相关文章

  1. java代码块执行顺序

    父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...

  2. Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)

    1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...

  3. Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序

    实例化子类时,父类与子类中的静态代码块.实例代码块.静态变量.实例变量.构造函数的执行顺序是怎样的? 代码执行的优先级为: firest:静态部分 second:实例化过程 详细顺序为: 1.父类静态 ...

  4. 【Java】成员变量赋值执行顺序

    程序中成员变量赋值的执行顺序

  5. 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)

    问题 在<深入理解Java虚拟机>一书中遇到了如下代码: public int method() { int i; try { i = 1; return i; } catch (Exce ...

  6. java初始化块执行顺序

    java中初始化块的执行顺序在构造器之前,多个初始化块之间定义在前的先执行.如下: public class InitialBlockTest { // The first one { System. ...

  7. java中代码执行顺序

    静态代码块 -- >构造代码块 --> 构造方法静态代码块:只执行一次构造代码块:每次调用构造方法都执行 http://blog.csdn.net/wuhaiwei002/article/ ...

  8. Java基础系列5:Java代码的执行顺序

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...

  9. Java——Java代码的执行顺序

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...

随机推荐

  1. 发现一个CentOS第三方源epel的仓库地址(repos.fedorapeople.org)

    这个站点(http://repos.fedorapeople.org)很有意思,比如要安装maven,官方源默认是没有的,当然可以安装epel源,而如果只要单独安装,可以直接安装一个仓库地址. 下面将 ...

  2. Windows UWP开发系列 – RelativePanel

    RelativePanel是在Windows 10 UWP程序中引入的一种新的布局面板,它是通过附加属性设置元素间的位置关系来对实现布局的.一个简单的示例如下: <RelativePanel&g ...

  3. Tasker文件夹说明

    ################导入类#################路径 类型 后缀名 /tasker/profiles/ 配置 .prf.xml /tasker/projects/ 项目 .pr ...

  4. Simple Addition Permits Voltage Control Of DC-DC Converter's Output

    http://electronicdesign.com/power/simple-addition-permits-voltage-control-dc-dc-converters-output In ...

  5. System.Threading.Tasks.Task 任务引起的IIS应用程序池崩溃

    转载:http://www.cnblogs.com/aaa6818162/p/4421305.html 问题现象 IIS应用程序池崩溃(Crash)的特征如下: 1. 从客户端看,浏览器一直处于连接状 ...

  6. Okam(奥卡姆):小程序开发框架

    Okam(奥卡姆):小程序开发框架 Okam 是什么 `Okam` 一个面向小程序开发的开发框架,开发体验类 `Vue`.详情 Okam 对各小程序的支持情况 支持 百度小程序 支持 微信小程序 支持 ...

  7. pm2 相关命令

    pm2 相关命令 转载 2017年02月18日 22:59:48   二.安装 Linux Binaries下载地址:https://nodejs.org/dist cd oneinstack/src ...

  8. 介紹 IIS 8 全新的 HttpPlatformHandler 模組與 ASP.NET 5 Beta8 重大變更

    HttpPlatformHandler 是一個支援 IIS 8 與 IIS 8.5 的原生模組 (native module),主要使用於 Microsoft Azure Websites 網站服務中 ...

  9. slf4j log4j logback log4j2关系详解和相关用法

    来源:slf4j log4j logback关系详解和相关用法https://www.cnblogs.com/Sinte-Beuve/p/5758971.html The Simple Logging ...

  10. ActiveMQ使用示例之Topic

    非持久的Topic消息示例  对于非持久的Topic消息的发送基本跟前面发送队列信息是一样的,只是把创建Destination的地方,由创建队列替换成创建Topic,例如: Destination d ...