当创建一个对象时,会先初始化类(静态成员),然后再实例化这个类(非静态成员)便得到一个对象。也就是说,当我们调用ClassName obj=new ClassName();的时候,系统
先加载这个类(第一次出现),然后再初始化这个类的数据,再然后创建对象并初始化,最后让obj引用它。
Java为我们提供了构造器、非静态初始化块和静态初始化块用于创建一个对象,它们的执行顺序有一个总的原则(优先级向下递减):
1.先执行父类的构造器、非静态初始化块和静态初始化块
2.先执行静态初始化块(用于初始化类)
3.先执行非静态初始化块(用于初始化对象)
4.执行类的构造器
下面以一个实例演示:
B继承A,C继承B
class A{
//Constructor
public A(){
System.out.println("Constructor Method in Class A invoking...");
}
//Non-static initial block
{
System.out.println("Non-Static initial block in Class A invoking...");
}
//Static initial block
static{
System.out.println("Static initial block in Class A invoking...");
}
}
class B extends A{
//Constructor
public B(){
System.out.println("Constructor Method in Class B invoking...");
}
//Non-static initial block
{
System.out.println("Non-Static initial block in Class B invoking...");
}
//Static initial block
static{
System.out.println("Static initial block in Class B invoking...");
}
}
class C extends B{
//Constructor
public C(){
System.out.println("Constructor Method in Class C invoking...");
}
//Non-static initial block
{
System.out.println("Non-Static initial block in Class C invoking...");
}
//Static initial block
static{
System.out.println("Static initial block in Class C invoking...");
}
}
public class InitTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
new C();
}
}
运行结果:
欢迎指正!