欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Ali一面真题之《Java程序初始化的顺序是怎么样的?》

程序员文章站 2022-03-10 19:10:20
现在有一个子类有一个父类,父类和子类里面分别各有一个静态块和一个构造方法,父类的构造方法里面输出了一句话,就是syso(“A”),父类的静态块里面打出B,子类的构造方法里面打出C,子类的静态块里面打出D;new 一下子类(实例化一下)按什么顺序输出一下刚才的ABCD呐?换一个问题问:(另外一个方式)同一个类里面,有一个静态块和一个构造方法,你觉得是静态块先执行呐还是构造方法先执行呐?在这个类实例化的时候。如果有一个子类继承一个父类,是父类的先执行父类的构造方法还是先执行子....

现在有一个子类有一个父类,
父类和子类里面分别各有一个静态块和一个构造方法,
父类的构造方法里面输出了一句话,就是syso(“A”),
父类的静态块里面打出B,
子类的构造方法里面打出C,
子类的静态块里面打出D;
new 一下子类(实例化一下)
按什么顺序输出一下刚才的ABCD呐?

换一个问题问:(另外一个方式)
同一个类里面,有一个静态块和一个构造方法,
你觉得是静态块先执行呐还是构造方法先执行呐?
在这个类实例化的时候。

如果有一个子类继承一个父类,
是父类的先执行父类的构造方法还是先执行子类的静态块?


这个基础如果打的很牢的话,信手拈来,如果不牢出门右拐再左转


且看代码

class Base {

    // 1、父类的静态语句块
    static {
        System.out.println("B");
    }
    // 2、父类的非静态语句块
    {
        System.out.println("C");
    }
    // 3、父类的构造器
    public Base(){
        System.out.println("A");
    }

}

public class Derived extends Base {

    // 1、子类的静态语句块
    static {
        System.out.println("E");
    }
    // 2、子类的非静态语句块
    {
        System.out.println("F");
    }
    // 3、子类的构造器
    public Derived(){
        System.out.println("D");
    }

    public static void main(String[] args) {
        // 实例化对象
        new Derived();// BECAFD
    }

}

且看运行结果
Ali一面真题之《Java程序初始化的顺序是怎么样的?》


在 Java 语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,
只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
初始化一般遵循3个原则:
 ① 静态对象(变量)优先于非静态对象(变量)初始化,
 	静态对象(变量)只初始化一次,
 	而非静态对象(变量)可能会初始化多次;
 ② 父类优先于子类进行初始化;
 ③ 按照成员变量的定义顺序进行初始化。
 	即使变量定义散布于方法定义之中,
 	它们依然在任何方法(包括构造函数)被调用之前先初始化;

 加载顺序
 父类(静态变量、静态语句块)
 子类(静态变量、静态语句块)
 父类(实例变量、普通语句块)
 父类(构造函数)
 子类(实例变量、普通语句块)
 子类(构造函数)

所以一开始的问题的答案是:

Ali一面真题之《Java程序初始化的顺序是怎么样的?》


所以你若打好基础,Ali不就进了么。。。
还等啥呐,加油学吧!

本文地址:https://blog.csdn.net/frdevolcqzyxynjds/article/details/109576182