在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有的类成员完成了初始化之后,才会调用对象所在类的构造函数创建对象。
Java程序的初始化一般遵循三个原则(优先级依次递减):
1,静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化很多次。
2,父类优先于子类进行初始化。
3,按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法被调用之前先初始化。
Java程序初始化工作可以在许多不同的代码块中完成(例如静态代码块,构造函数等),它们的执行顺序如下:
父类静态变量
父类静态代码块
子类静态变量
子类静态代码块
父类非静态变量
父类非静态代码块
父类构造函数
子类非静态变量
子类非静态代码块
子类构造函数。
下面给出一个不同模块初始化时执行顺序的一个例子。
class Base{
? ?????????static {
????????????????System.out.println("Base static block");
?????????????????????}
???????????public Base(){
? ? ? ? ? ?System.out.println("Base constructor");
? ? ? ? ? ?}
?public class Derived extends Base{
? ? ? ? ? ?static{
? ? ? ? ? System.out.println("Drevied static block");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? {
? ? ? ? ? System.out.println("Drevied? block");
? ? ? ? ? ?}
?public? Derived(){
? ? ? ? ??System.out.println("Drevied? constructor");
? ? ? ? ? }
public static void main(String args[]){
? ? ? ? ? ? ? ? new Derived();
? ? ??????}
? ? ? ? ? }
先自己利用上面给出的执行顺序进行判断
程序的运行结果为
Base static block
Derived static block
Base block
Base constructor
Derived block
Derived constructor
怎么样,运行结果是否与你的结果一致呢?
最后,我们再来看一道面试真题:
下列代码运行结果是什么?
? class B?extends Object{
? ? ? ? ? static{
? ? ? ? ? System.out.println("Load B1");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ?public? B(){
? ? ? ? ??System.out.println("Create B");
? ? ? ? ? }
? ? ? ? ? ?static{
? ? ? ? ? System.out.println("Load B2");
? ? ? ? ? ?}
? ? ? ? ? ?}
class A?extends B{
? ? ? ? ? static{
? ? ? ? ? System.out.println("Load A");
? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ?public? A(){
? ? ? ? ??System.out.println("Create A");
? ? ? ? ? }
? ? ? ? ??}
? ? ? ? ? public class Testclass{
? ? ? ? ? public static void main(String[ ] args){
? ? ? ? ? ? ? ? ? ? ? ? new A();
? ? ? ? ? }
? ? ? ? ? }
运行结果是Load B1? ? ? LoadB2? ? ? Load A? ? ?Create B? ? ?Create A
在面试中出现的执行顺序的问题,无非也就是把上面的代码再换几个形式,但,万变不离其宗,只要掌握它的执行顺序的规律,所有问题就都可以迎刃而解了!!!
若有错误,请尽情批评指正!!!
若对您有帮助,请给予三连支持!!!!
|