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

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. JAVA容器-模拟ArrayList的底层实现

    概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...

  2. Ubuntu14.04和Tiny6410挂载NFS服务!

    我是以root身份登录Ubuntu的: 在Ubuntu上执行   #apt-get install nfs-kernel-server    //安装NFS服务 在Ubuntu上执行   #mkdir ...

  3. CentOS包管理yum常用命令(转)

    一.安装 yum install 全部安装yum install package1 安装指定的安装包package1yum groupinsall group1 安装程序组group1 二.更新和升级 ...

  4. openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)

    原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特 ...

  5. ubuntu14.04 内核升级到 linux kernel 4.9

    http://blog.csdn.net/liuruiqun/article/details/55097292

  6. 关于Gson在强转时的ClassCastException

    关于Gson的坑人指出: 将list转化为json String beanListToJson = gson.toJson(list, type); 将json还原为list List<T &g ...

  7. ipad2 wifi ios7.x 1.0.1还是无法越狱

    原话: Warning! We have reports that the iPad 2 (wifi) is not yet compatible with the jailbreak and wil ...

  8. python的__slots__节约内存的魔法;检查python每一行代码内存占用情况的工具

    在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行时去设置任意的新属性. 然而,对于有着已知属性的小类来说,它可能是个瓶颈 ...

  9. 实现SQL Server中的切割字符串SplitString函数

    有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.没什么好说的,需要的朋友直接拿去用吧 SET ANSI_NULLS ON GO S ...

  10. linux文本文件按列合并

    http://blog.163.com/liang8421@126/blog/static/894819572009386653912/ 我想把文本文件file1 和文本文件 file2按照相应的行合 ...