class Bird
{
static
{
System.out.println("祖类的静态成员初始化。。。");
}
{
System.out.println("祖类的非静态成员初始化。。。");
}
public Bird()
{
System.out.println("祖类的构造函数调用。。。");
}
}
class Raptor extends Bird
{
static
{
System.out.println("父类的静态成员1初始化。。。");
}
public Raptor()
{
System.out.println("父类的构造函数调用。。。");
}
{
System.out.println("父类的非静态成员初始化。。。");
}
static
{
System.out.println("父类的静态成员2初始化。。。");
}
}
class Hawk extends Raptor
{
static
{
System.out.println("子类的静态成员初始化。。。");
}
{
System.out.println("子类的非静态成员初始化。。。");
}
public Hawk()
{
System.out.println("子类的构造函数调用。。。");
}
public static void main(String[] args)
{
System.out.println("main函数开始运行。。。");
new Hawk();
System.out.println("main函数结束运行。。。");
}
}
运行结果:
祖类的静态成员初始化。。。
父类的静态成员1初始化。。。
父类的静态成员2初始化。。。
子类的静态成员初始化。。。
main函数开始运行。。。
祖类的非静态成员初始化。。。
祖类的构造函数调用。。。
父类的非静态成员初始化。。。
父类的构造函数调用。。。
子类的非静态成员初始化。。。
子类的构造函数调用。。。
main函数结束运行。。。
注解:
1、对象的初始化
(1)非静态对象的初始化
在创建对象时,对象所在类的所有数据成员会首先进行初始化。
基本类型:int型,初始化为0。
如果为对象:这些对象会按顺序初始化。
※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。
构造方法的作用就是初始化。
(2)静态对象的初始化
程序中主类的静态变量会在main方法执行前初始化。
不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。
2、继承时,对象的初始化过程
(1)主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。
(2)主类静态成员的初始化。
(3)主类的超类由高到低进行默认构造方法的调用。注意,在调用每一个超类的默认构造方法前,先进行对此超类进行非静态对象的初始化。
(4)主类非静态成员的初始化。
(5)调用主类的构造方法。