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
}
}
且看运行结果
在 Java 语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,
只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
初始化一般遵循3个原则:
① 静态对象(变量)优先于非静态对象(变量)初始化,
静态对象(变量)只初始化一次,
而非静态对象(变量)可能会初始化多次;
② 父类优先于子类进行初始化;
③ 按照成员变量的定义顺序进行初始化。
即使变量定义散布于方法定义之中,
它们依然在任何方法(包括构造函数)被调用之前先初始化;
加载顺序
父类(静态变量、静态语句块)
子类(静态变量、静态语句块)
父类(实例变量、普通语句块)
父类(构造函数)
子类(实例变量、普通语句块)
子类(构造函数)
所以一开始的问题的答案是:
所以你若打好基础,Ali不就进了么。。。
还等啥呐,加油学吧!
本文地址:https://blog.csdn.net/frdevolcqzyxynjds/article/details/109576182
下一篇: libevent中的事件机制