下文讲述Java代码的初始化过程,如下所示:
普通代码块和静态块的运行顺序示例分享
今天面试时,被问到:“Java对象如何初始化呢?” 脑袋里面立刻浮现出"构造器"初始化, 面试官:“立马回应到”,没错,构造器是Java对象中常见的初始化方法, 那是否还有其它的初始化方法呢? 答案是 -------------------------------------------------- 静态代码块 采用静态代码块的方式 例: [修饰符]{ //初始化块的可执行代码 ... } -------------------------------------------------- 注意事项: 此处的修饰符只能为static例:
public class User { //定义一个初始化块 { System.out.println("初始化块-1"); } //定义第二个初始化块 { System.out.println("初始化块-2"); } //定义无参的构造器 public User() { System.out.println("无参构造器"); } public static void main(String[] args) { new User(); } } ---------运行以上代码,将输出以下信息------ 初始化块-1 初始化块-2 无参构造器 /* 从以上的代码运行上,我们可以得到结论: 当我们new一个User对象时, 程序会先运行静态代码块,然后再运行无参构造器 */ ----------------------------------------------------
初始化块和构造方法区别
- 构造器可接收参数,而静态代码块不能接收任何参数
- 代码块通常用于初始化操作,如:静态代码块对类进行初始化,普通代码块负责对对象进行初始化
普通代码块和静态块的运行顺序示例分享
class GongJu{ static { System.out.println("GongJu的静态初始化块"); } { System.out.println("GongJu的普通初始化块"); } public GongJu(){ System.out.println("GongJu的无参构造器"); } } class Che extends GongJu{ static { System.out.println("Che的静态初始化块"); } { System.out.println("Che的普通初始化块"); } public Che(){ System.out.println("Che的无参构造器"); } public Che(String name){ this();//调用同类中的重载构造器 System.out.println("Che的带参构造器,name="+name); } } class QiChe extends Che{ static { System.out.println("QiChe的静态初始化块"); } { System.out.println("QiChe的普通初始化块"); } public QiChe(){ //调用父类中带参数的构造器 super("Java典籍"); System.out.println("QiChe的无参构造器"); } } public class Test { public static void main(String[] args) { new QiChe(); System.out.println("========="); new QiChe(); } } -------运行以上代码,将输出以下信息-------------- GongJu的静态初始化块 Che的静态初始化块 QiChe的静态初始化块 GongJu的普通初始化块 GongJu的无参构造器 Che的普通初始化块 Che的无参构造器 Che的带参构造器,name=Java典籍 QiChe的普通初始化块 QiChe的无参构造器 ========= GongJu的普通初始化块 GongJu的无参构造器 Che的普通初始化块 Che的无参构造器 Che的带参构造器,name=Java典籍 QiChe的普通初始化块 QiChe的无参构造器
第一次创建QiChe对象时, 此时系统还未有QiChe对象, 因此需要先加载并初始化QiChe类, 初始化QiChe类会先执行其顶层父类的静态初始化块, 再执行其直接父类的静态初始化块, 最后才执行其本身的静态初始化块。 一旦QiChe类初始化成功后,其在虚拟机中一直存在, 当第二次再创建QiChe对象时 无需再对QiChe类进行初始化。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。