【面相对象】静态代码块、构造代码块和构造函数的执行顺序

版权声明:本文为博主项目中经验总结,著文备份,欢迎补充交流! https://blog.csdn.net/u013806583/article/details/69934058

前言:java有四大代码块:静态代码块、构造代码块、局部代码块、同步代码块。
………………………………………………………………………………………………
………………………………………………………………………………………………
………………………………………………………………………………………………
现在我们主要讨论前三种。

先看一种情况:

父类

package static_code;

/**
 * Created by guan on 4/9/17.
 */
public class Parent {

    //父类,构造代码块
    {
        System.out.println("Parent's Code Block");
    }
    //父类,静态代码块
    static {
        System.out.println("Parent's Static Code Block");
    }
    //父类,局部代码块,是构造函数
    public Parent()
    {
        System.out.println("Parent's Constructor.");
    }
}

同理:子类

package static_code;

/**
 * Created by guan on 4/9/17.
 */
public class Child extends Parent {

    {
        System.out.println("Child's Code Block.");
    }

    static {
        System.out.println("Child's Static Code Block.");
    }

    public Child()
    {
        System.out.println("Child's Constructor.");
    }

    //==========================================================
    /**
     * main函数,程序入口
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println("main function is called.");
        new Child();
    }
    //==========================================================
}

程序运行结果:

Parent's Static Code Block
Child's Static Code Block.
main function is called.
Parent's Code Block
Parent's Constructor.
Child's Code Block.
Child's Constructor.

结果:

1、父类静态代码块(先声明的先执行);

2、子类静态代码块(先声明的先执行);

3、父类的代码块(先声明的先执行);

4、父类的构造函数;

5、子类的代码块(先声明的先执行);

6、子类的构造函数。

1- 静态代码块和静态变量一样,在类加载的时候执行,即在main函数调用之前就已经执行了
静态代码块和静态变量是先声明的先执行,并且只执行一次

2- 构造代码块在创建对象的时候执行,每创建一个对象就执行一次,即可以执行多次。
构造代码块在构造函数前执行。


父类加入静态变量的情况

新的父类:

package static_code;

/**
 * Created by guan on 4/9/17.
 */
public class Parent {

    static BasicClass bc=new BasicClass("Static variate :bc");

    BasicClass bc2=new BasicClass("variate: bc2");

    {
        System.out.println("Parent's Code Block");
    }

    static {
        System.out.println("Parent's Static Code Block");
    }

    public Parent()
    {
        System.out.println("Parent's Constructor.");
    }
}

变量的定义

/**
 * Created by guan on 4/9/17.
 */
public class BasicClass {
    public BasicClass(String s)
    {
        System.out.println("Basic Class Print Something:\t"+s);
    }

}

结果

Basic Class Print Something:    Static variate :bc
Parent's Static Code Block
Child's Static Code Block.
main function is called.
Basic Class Print Something:    variate: bc2
Parent's Code Block
Parent's Constructor.
Child's Code Block.
Child's Constructor.

结果正好验证的上面的结论:
对于静态代码块和静态变量,先定义的先执行。
对于构造代码块和全局变量,先定义的先执行。

猜你喜欢

转载自blog.csdn.net/u013806583/article/details/69934058