Java中类的加载过程

Java中类的加载过程

JAVA中静态代码块、构造方法、Super()父类与子类之间执行顺序

属性、方法、构造方法和自由块都是类中的成员,在创建对象时,各成员的执行顺序如下。
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。

1.父类、子类之间代码块与构造方法

public class HelloA {
    static {
        System.out.println("static A");
    }

    {System.out.println("I'm A class");}

    public HelloA() {

        System.out.println("HelloA");
    }
    public HelloA(String s) {

        System.out.println(s + "HelloA");
    }

    public static void main(String[] args) {
        new HelloB();
    }
}
class HelloB extends HelloA {
    public HelloB () {
        //只能调用一个父类的构造方法
        //super();
        super("parent");
        System.out.println("HelloB");
    }
    {System.out.println("I'm B class");}
    static {
        System.out.println("static B");
    }
}

执行结果:
static A
static B
I’m A class
parentHelloA
I’m B class
HelloB

总结如下:

  • 1、代码块于构造方法之前执行,静态于非静态之前;

  • 2、在类第一次被调用时,加载该类,静态代码块只执行一次;

  • 3、项目启动时,只加载需要加载的类(比如xml中显示配置的bean,或者web.xml中的listener等),并不会将所有的类都加载(这是很可怕的事情);

  • 4、静态代码块只能调用静态变量;静态方法只能调用静态变量;

  • 5、非静态代码块或非静态方法可以调用任何(静态+非静态)变量。

  • 6、非静态代码块在实例化对象时,于构造方法之前执行。

2.父类、子类与super()

public class People {
    String name;
    public People() {
        System.out.println(1);
    }
    public People(String name) {
        System.out.println(2);
        this.name = name;
    }
}
class Child extends People {
    People father;
    public Child () {
        //super()系统会默认添加的
        System.out.println(4);
    }
    public Child (String name) {
        //super()系统会默认添加的
        System.out.println(3);
        this.name = name;
        father = new People(name + ":F");
    }
    public static void main(String[] args) {
        new Child("mike");
    }
}

故执行结果:132

另外一个难缠的实例

public class ExA {
    private static ExA a = new ExA();
    static {
        System.out.println("父类--静态代码块");
    }

    public ExA() {
        System.out.println("父类--构造函数");
    }

    {
        System.out.println("父类--非静态代码块");
    }

    public static void main(String[] args) {
        new ExB();
    }
}

class ExB extends ExA {

    private static ExB b = new ExB();

    static {
        System.out.println("子类--静态代码块");
    }
    {
        System.out.println("子类--非静态代码块");
    }

    public ExB() {
        System.out.println("子类--构造函数");
    }
}

result as follows:

  • 父类--非静态代码块
  • 父类--构造函数
  • 父类--静态代码块
  • 父类--非静态代码块
  • 父类--构造函数
  • 子类--非静态代码块
  • 子类--构造函数
  • 子类--静态代码块
  • 父类--非静态代码块
  • 父类--构造函数
  • 子类--非静态代码块
  • 子类--构造函数

参考:互联网

猜你喜欢

转载自www.cnblogs.com/hglibin/p/9695806.html
今日推荐