Java按如下原则进行成员变量初始化:
1、先执行static修饰的成员(static变量、static代码块,两者优先级按代码次序);【前提是static修饰的成员还未初始化,若已初始化,不再初始化,即static修饰的成员只执行一次初始化】
2、然后再是非静态成员变量(包含非静态实例初始化)(非静态成员变量初始化次序按代码次序);
3、最后是构造方法;
4、先父类,再子类。
注意:
第“4”点意思是指:按1、2、3的顺序初始化,并且,1中先父类再子类,2中
先父类再子类,3中先父类再子类。
看代码:
public class Test {
Test() {i = f(100);}
static{
System.out.println("Test()");
}
int f(int n){return n;}
int g() {return 11;}
int i = g();
int j = f(i);
public static void main(String[] args){
Test a = new Test();
System.out.println(a.i+","+a.j);
new B();
}
}
class A{
static{
System.out.println("A()");
}
A(){
System.out.println("Father");
}
}
class B extends A{
static int a = 1,b = 1;
int d = 1;
static{
b = 2;
int c = 2;
System.out.println("B()");
System.out.println("a:"+a+",b:"+b+",c:"+c);
}
B(){
System.out.println("Child");
System.out.println("a:"+a+",b:"+b);
System.out.println("d:"+d);
}
}
再看代码:
public class Test {
Test() {i = f(100);}
static{
System.out.println("Test()");
}
int f(int n){return n;}
int g() {return 11;}
int i = g();
int j = f(i);
public static void main(String[] args){
Test a = new Test();
System.out.println(a.i+","+a.j);
new B();
}
}
class A{
static{
System.out.println("A()");
}
A(){
System.out.println("Father");
}
}
class B extends A{
int d = 1;
{
System.out.println("B()"+d); //此处为非静态实例
}
static{
b = 2;
int c = 2;
int dd = 2;
System.out.println("Child");
System.out.println("B()");
//System.out.println("a:"+a+",b:"+b+",c:"+c+",dd:"+dd);会报错,应该如下:
//仔细对比以下两行
System.out.println("a:"+B.a+",b:"+B.b+",c:"+c+",dd:"+dd);
System.out.println("a:"+B.a+",b:"+B.b+",c:"+c+",dd:"+B.dd);
}
static int a = 1, b = 1, dd;
B(){
System.out.println("a:"+a+",b:"+b);
System.out.println("d:"+d);
}
}