当前位置: 移动技术网 > IT编程>开发语言>Java > Ali一面真题之《Java程序初始化的顺序是怎么样的?》

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

2020年11月09日  | 移动技术网IT编程  | 我要评论
现在有一个子类有一个父类,父类和子类里面分别各有一个静态块和一个构造方法,父类的构造方法里面输出了一句话,就是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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网