JAVA变量的执行顺序
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
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变量的执行顺序的更多相关文章
- java代码块执行顺序
父类 public class Father { public Father() { System.out.println("父类构造PUBLIC father"); } stat ...
- Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)
1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
实例化子类时,父类与子类中的静态代码块.实例代码块.静态变量.实例变量.构造函数的执行顺序是怎样的? 代码执行的优先级为: firest:静态部分 second:实例化过程 详细顺序为: 1.父类静态 ...
- 【Java】成员变量赋值执行顺序
程序中成员变量赋值的执行顺序
- 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)
问题 在<深入理解Java虚拟机>一书中遇到了如下代码: public int method() { int i; try { i = 1; return i; } catch (Exce ...
- java初始化块执行顺序
java中初始化块的执行顺序在构造器之前,多个初始化块之间定义在前的先执行.如下: public class InitialBlockTest { // The first one { System. ...
- java中代码执行顺序
静态代码块 -- >构造代码块 --> 构造方法静态代码块:只执行一次构造代码块:每次调用构造方法都执行 http://blog.csdn.net/wuhaiwei002/article/ ...
- Java基础系列5:Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...
- Java——Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...
随机推荐
- Dual-polarity supply provides ±12V from one IC
LT1961 升压型稳压器造就了兼具升压和降压能力的扁平状SEPIC Transformerless dc/dc converter produces bipolar outputs Well-reg ...
- Current mirror drives multiple LEDs from a low supply voltage
Driving LEDs at a regulated current from low supply voltages can be difficult because minimal overhe ...
- loading(正在加载特效)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 【资料】wod食物
注意:1. 除非另外注明, 所有效果持续时间为整个地城2. 某几样食物若使用午饭时间技能, 效果只有LV1 (lunch level -25), 请小心服用. X技能等级 = 技能等级 焖豆属性奖励体 ...
- USACO numtri 数塔问题
/* ID:kevin_s1 PROG:numtri LANG:C++ */ #include <iostream> #include <cstdio> #include &l ...
- python笔记20-yaml文件写入(ruamel.yaml)
前言 yaml作为配置文件是非常友好的一种格式,前面一篇讲了yaml的一些基础语法和读取方法,本篇继续讲yaml文件写入方法 用yaml模块写入字典嵌套字典这种复杂的数据,会出现大括号{ },不是真正 ...
- Redis事务为什么不支持回滚
在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪.然而,这种行为也有其合理之处:只有当被调用的Redis命 ...
- 一个 forceLayout() 和 requestLayout() 的测试
两个view: 一个是系统默认的FrameLayout, A 一个是自己自定义的MyView extends View,重载了onMeasure函数(): B @Override protected ...
- django 基础知识回顾
内容回顾: 1. ajax参数 url: type: data: 1.value不能是字典 {k1:'v1',k2:[1,2,3,],k3; JSON.string} 2.$('').serilize ...
- Python requests 报错解决集锦
python版本号和ssl版本号都会导致 requests在请求https站点时候会出一些错误,最好使用新版本号. 1 Python2.6x use requests 一台老Centos机器上跑着古老 ...