类中静态代码块、实例代码块、构造方法执行次序

    在类加载的时候,静态代码中的语句会执行,在整个类加载的过程中只执行一次,和创建多少个对象没有关系

    实例代码块中的语句,经过编译后,会添加到构造方法第一条语句之前

    构造方法:每次创建对象时候都会执行

举个简单的例子

public class Person {
    public String name;
    public String gender;
    public int age;
    public Person(String name,String gender,int age){
        this.name =name;
        this.gender = gender;
        this.age = age;
        System.out.println("基类的构造方法");
    }

    {
        System.out.println("基类的实例代码块");
    }

    static {
        System.out.println("基类中的静态代码块");
    }
}
public class Student extends Person{
    public int id;

    public Student(String name,String gender,int age,int id){
        super(name,gender,age);
        this.id = id;
        System.out.println("子类的构造方法");
    }

    {
        System.out.println("子类的实例代码块");
    }

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

    public static void main(String[] args) {
        Student s1 = new Student("张三","男",24,11111);
        System.out.println("=================================");
        Student s2 = new Student("李四","男",35,11668);
    }
}

执行结果为:

通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,而且是最早执行

2、父类实例方法和父类构造方法紧接着执行

3、子类的实例代码块和子类的构造方法紧接着再执行

4、第二次实例化对象时,父类和子类的静态代码块都将不会再执行

5、静态代码块先执行,并且只执行一次,在类加载阶段执行

6、如果类没有加载,先加载类:先加载基类,后加载子类,基类的静态代码块先执行,子类的代码块后执行,并且都只执行一次

7、当有对象创建的时候,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

  注意:

   1、new哪个类的对象,编译器就会调用该类的构造方法

   2、new子类对象:编译器会调用子类的构造方法

        a、从基类继承下来的成员变量,通过super()调用基类构造方法

        b、子类新增加的成员

   3、基类构造方法中的内容先打印,然后子类构造方法中的内容后打印

   但是:不能通过打印结果说明 先调用基类的构造方法,后调用子类的构造方法(说法错误

猜你喜欢

转载自blog.csdn.net/m0_53677355/article/details/126598933