java初始化与动态绑定 (一)

2014-11-24 11:45:00 · 作者: · 浏览: 10

初始化顺序:

1、静态成员初始化;

先是父类中的静态成员初始化(包括静态域值和静态语句块,按照声明顺序初始化),再是子类成员初始化。这里会一直追溯到最顶层的基类哈。

静态成员的初始化发生在类被加载时,这时不一定调用了构造器。当程序试图访问某一个类时,就会加载此类。

2、非静态成员的初始化;

3、调用构造函数。

注意2和3的顺序为,父类的非静态成员的初始化---->父类构造器----->子类的非静态成员的初始化----->子类构造器。
示例如下:


[java]
public class Father {

private static int fa_static1 = printInit("static value in father!");
private int fa_instance1 = printInit("instance value in father!");
static
{
printInit("static block in father!");
}
private static int fa_static2 = printInit("another static value in father!");

{
printInit("common block in father!");
}

private int fa_instance2 = printInit("another instance value in father!");

public Father(){
System.out.println("default father constructor!");
}
public Father(int i){
System.out.println("father constructor with parameter i = " + i);
}

protected static int printInit(String s){
System.out.println(s);
return 1;
}

}

public class Father {

private static int fa_static1 = printInit("static value in father!");
private int fa_instance1 = printInit("instance value in father!");
static
{
printInit("static block in father!");
}
private static int fa_static2 = printInit("another static value in father!");

{
printInit("common block in father!");
}

private int fa_instance2 = printInit("another instance value in father!");

public Father(){
System.out.println("default father constructor!");
}
public Father(int i){
System.out.println("father constructor with parameter i = " + i);
}

protected static int printInit(String s){
System.out.println(s);
return 1;
}

}
[java]

public class Son extends Father{

private static int son_static1 = printInit("static value in son!");
private int son_instance1 = printInit("instance value in son!");
static
{
printInit("static block in son!");
}
private static int son_static2 = printInit("another static value in son!");

{
printInit("common block in son!");
}
private int son_instance2 = printInit("another instance value in son!");

public Son(){
System.out.println("default son constructor!");
}

public Son(int i){
super(i);
System.out.println("son constructor with parameter i = " + i);
}

public static void main(String[] args) {
System.out.println("------test1-----------");
Father.printInit("java");
System.out.println("------test2-----------");
Son s1 = new Son();
System.out.println("------test3-----------");
Son s2 = new Son(2);
}
}

public class Son extends Father{

private static int son_static1 = printInit("static value in son!");
private int son_instance1 = printInit("instance value in son!");
static
{
printInit("static block in son!");
}
private static int son_static2 = printInit("another static value in son!");

{
printInit("common block in son!");
}
private int son_instance2 = printInit("another instance value in son!");

public Son(){
System.out.println("default son constructor!");
}

public Son(int i){
super(i);
System.out.println("son constructor with parameter i = " + i);
}

public static void main(String[] args) {
System.out.println("------test1----