创建对象时类的调用顺序

代码块

1.创建一个对象时,在一个类中调用的顺序是:

1.调用静态代码块和静态属性初始化(优先级相同,如果有多个,则按他们定义的顺序调用)
2.调用普通代码块和普通属性的初始化(优先级相同,如果有多个,则按他们定义的顺序调用)
3.构造方法是最后才调用

实例:

package com.example.Codeblock;


/**
 * @author gaoqinghui
 * @date 2022/4/26 22:35


public class CodeBlockDetail02 {
    public static void main(String[] args) {
        Detail01 detail01 = new Detail01();
        
    }
}

class Detail01 {

    private int n2 = getN2();   //非静态属性

    //普通代码块
    {
        System.out.println("Detail01普通代码块被执行");
    }

    //下面这个是静态属性初始话,调用顺序的优先级和静态代码块相同
    //如果都两个都有,按放置的位置来决定谁先背调用
    private static int n1 = getN1();

    static {
        System.out.println("Detail01静态代码块被执行");
    }


    public static int getN1() {
        System.out.println("getN1被调用");
        return 100;
    }

    public int getN2() {        //非静态方法
        System.out.println("getN2被调用");
        return 200;
    }

    //无参构造器
    public Detail01() {
        System.out.println("Detail01()构造器被调用");
    }
}

2.构造器的最前面其实隐含了super()和调用普通代码块,但是静态相关的代码块和静态属性初始化是最先执行的,不管在什么时候,因为在类加载时就执行了静态相关的代码块和静态属性初始化。

package com.example.Codeblock;



/**
 * @author gaoqinghui
 * @date 2022/4/26 23:03
 */
public class CodeBlockDetail03 {
    public static void main(String[] args) {
        new BBB();
        //输出结果:1.AAA的静态代码块被执行 2.AAA()构造器被执行 3.BBB普通代码块被执行 4.BBB()构造器被执行
    }
}


class AAA {
    //进来后先找静态代码块,再找普通代码块,再找构造器
    static {
        System.out.println("AAA的静态代码块被执行");
    }

    public AAA() {
        //super();      去找object的构造器
        //本类普通代码块
        System.out.println("AAA()构造器被执行");
    }

    {
        System.out.println("AAA的普通代码块被执行");
    }
}

class BBB extends AAA{

    {
        System.out.println("BBB普通代码块被执行");
    }

    public BBB() {
        //super(); 去到父类中先找静态代码块,再找普通代码块,再找构造器
        //调用本类普通代码块
        System.out.println("BBB()构造器被执行");
    }
}

3.创建一个子类时(有继承关系),他们的静态代码块、静态属性初始化、普通代码块、普通属性初始化,构造方法的调用顺序如下:

1. 父类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行);
2. 子类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行);
3. 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行);
4. 父类的构造方法;
5. 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行);
6. 子类的构造方法;
posted @ 2022-05-10 17:09  忧愁小松鼠  阅读(152)  评论(0)    收藏  举报