详解java类的生命周期(二)

2014-11-24 07:51:07 · 作者: · 浏览: 2
id method(){}
}

class SubInitClass extends InitClass{}

public class Test1 {

/**
* 主动引用引起类的初始化的第四种情况就是运行Test1的main方法时
* 导致Test1初始化,这一点很好理解,就不特别演示了。
* 本代码演示了前三种情况,以下代码都会引起InitClass的初始化,
* 但由于初始化只会进行一次,运行时请将注解消掉,依次运行查看结果。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
// 主动引用引起类的初始化一: new对象、读取或设置类的静态变量、调用类的静态方法。
// new InitClass();
// InitClass.a = "";
// String a = InitClass.a;
// InitClass.method();

// 主动引用引起类的初始化二:通过反射实例化对象、读取或设置类的静态变量、调用类的静态方法。
// Class cls = InitClass.class;
// cls.newInstance();

// Field f = cls.getDeclaredField("a");
// f.get(null);
// f.set(null, "s");

// Method md = cls.getDeclaredMethod("method");
// md.invoke(null, null);

// 主动引用引起类的初始化三:实例化子类,引起父类初始化。
// new SubInitClass();

}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class InitClass{
static {
System.out.println("初始化InitClass");
}
public static String a = null;
public static void method(){}
}

class SubInitClass extends InitClass{}

public class Test1 {

/**
* 主动引用引起类的初始化的第四种情况就是运行Test1的main方法时
* 导致Test1初始化,这一点很好理解,就不特别演示了。
* 本代码演示了前三种情况,以下代码都会引起InitClass的初始化,
* 但由于初始化只会进行一次,运行时请将注解消掉,依次运行查看结果。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
// 主动引用引起类的初始化一: new对象、读取或设置类的静态变量、调用类的静态方法。
// new InitClass();
// InitClass.a = "";
// String a = InitClass.a;
// InitClass.method();

// 主动引用引起类的初始化二:通过反射实例化对象、读取或设置类的静态变量、调用类的静态方法。
// Class cls = InitClass.class;
// cls.newInstance();

// Field f = cls.getDeclaredField("a");
// f.get(null);
// f.set(null, "s");

// Method md = cls.getDeclaredMethod("method");
// md.invoke(null, null);

// 主动引用引起类的初始化三:实例化子类,引起父类初始化。
// new SubInitClass();

}
}

上面的程序演示了主动引用触发类的初始化的四种情况。

类的初始化过程是这样的:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。先看一个例子,首先建两个类用来显示赋值操作:

[java] public class Field1{
public Field1(){
System.out.println("Field1构造方法");
}
}
public class Field2{
public Field2(){
System.out.println("Field2构造方法");
}
}
public class Field1{
public Field1(){
System.out.println("Field1构造方法");
}
}
public class Field2{
public Field2(){
System.out.println("Field2构造方法");
}
}

下面是演示初始化顺序的代码:

[java] class InitClass2{
static{
System.out.println("运行父类静态代码");
}
public static Field1 f1 = new Field1();
public static Field1 f2;
}

class SubInitClass2 extends InitClass2{
static{
System.out.println("运行子类静态代码");
}
public static Field2 f2 = new Field2();
}

public class Test2 {
public static void main(String[] args) throws ClassNotFoundException{
new SubInitClass2();
}
}
class InitClass2{
static{
System.out.println("运行父类静态代码");
}
public static Field1 f1 = new Field1();
public static Field1 f2;
}

class SubInitClass2 extends InitClass2{
static{
System.out.println("运行子类静态代码");
}
public static Field2 f2 = new Field2();
}

public class Test2 {
public static void main(String[] args) throws ClassNotFoundException{
new SubInitClass2();
}
}
上面的代码中,初始化的顺序是:第03行,第05行,第11行,第13行。第04行是声明操作,没有