java变量的初始化顺序小结

来源:互联网 发布:h618b改端口 编辑:程序博客网 时间:2024/05/01 17:18

本文转自:http://www.jb51.net/article/37885.htm,并作了增减。
1、无继承
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序是:
(静态变量、静态初始化块)>(变量、初始化块)>构造器
public class InitialOrderTest
{
public static String staticfield=”静态变量”;
public String field=”变量”;

static
{
System.out.println(staticField);
System.out.println(“静态初始化块”);
}

{
System.out.println(field);
System.out.println(“初始化块”);
}

public InitialOrderTest()
{
System.out.println(“构造器”);
}

public static void main(String[] args)
{
new InitialOrderTest();
}
}
输出结果:
静态变量
静态初始化块
变量
初始化块
构造器

2、有继承
子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成。
class Parent {
// 静态变量
public static String p_StaticField = “父类–静态变量”;
// 变量
public String p_Field = “父类–变量”;
// 静态初始化块
static {
System.out.println(p_StaticField);
System.out.println(“父类–静态初始化块”);
}
// 初始化块
{
System.out.println(p_Field);
System.out.println(“父类–初始化块”);
}
// 构造器
public Parent() {
System.out.println(“父类–构造器”);
}
}//如果你想把这两个类放在同一个文件且名字起为SubClass, 父类前不能加public
public class SubClass extends Parent { 
// 静态变量
public static String s_StaticField = “子类–静态变量”;
// 变量
public String s_Field = “子类–变量”;
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println(“子类–静态初始化块”);
}
// 初始化块
{
System.out.println(s_Field);
System.out.println(“子类–初始化块”);
}
// 构造器
public SubClass() {
System.out.println(“子类–构造器”);
}
// 程序入口
public static void main(String[] args) {
new SubClass();
}
}

输出结果:
父类–静态变量
父类–静态初始化块
子类–静态变量
子类–静态初始化块
父类–变量
父类–初始化块
父类–构造器
子类–变量
子类–初始化块
子类–构造器

3、静态变量和静态初始化块
静态变量和静态初始化块是按照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
public class testOrder {
// 静态变量
public static TestA a = new TestA();
public TestC c = new TestC();
// 静态变量
public static TestB b = new TestB();
public testOrder(){
System.out.println(“in constract”);
}
// 静态初始化块
static {
System.out.println(“静态初始化块”);
}
public static void main(String[] args) {
new testOrder();
}
}
class TestA {
public TestA() {
System.out.println(“Test–A”);
}
}
class TestB {
public TestB() {
System.out.println(“Test–B”);
}
}
class TestC {
public TestC() {
System.out.println(“Test–C”);
}
}

输出结果:
Test–A
Test–B
静态初始化块
Test–C
in constract

4、初始化杂记
1. 类中域的初始化:默认值为(数值为0、布尔变量为false、对象引用为null)
方法中局部变量必须明确初始化,否则会报错。
2. 如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。

0 0