java基础之类初始化顺序示例解析

 更新时间:2023年10月07日 15:59:08   作者:bug生产者  
这篇文章主要为大家介绍了java基础之类初始化顺序示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

初始化顺序

在类中变量定义的顺序决定了它们初始化的顺序。在创建任何java对象时,都是依次调用父类非静态初始化块、父类构造器执行初始化、本类的非静态初始化块、本类构造器执行初始化

public class House {
    // 构造器之前
    Window w1 = new Window(1);
    House(){
        System.out.println("House()");
        Window window = new Window(11);
    }
    // 构造器之后
    Window w2 = new Window(2);
    void f(){
        System.out.println("f()");
    }
    Window w3 = new Window(3);
    public static void main(String[] args) {
        House house = new House();
        house.f();
    }
}
public class Window {
    public Window(int mark){
        System.out.println("Window("+mark+")");
    }
}

执行结果

Window(1)
Window(2)
Window(3)
House()
Window(11)
f()

由执行结果可知,在进行对象实例化时先执行初始化块,再执行构造器主体部分

验证类加载

public class Initable {
    // 非编译期常量
    public static final int COUNT =new Random().nextInt(1000);
    static {
        System.out.println("Initable初始化");
    }
}
public class Initable1 {
    // 编译期常量
    public static final int COUNT = 47;
    static {
        System.out.println("Initable1初始化");
    }
}
public class Initable2 {
    public static int COUNT = 56;
    static {
        System.out.println("Initable2初始化");
    }
}
public class Initable3 {
    public static int COUNT = 33;
    static {
        System.out.println("Initable3初始化");
    }
}
public class Initable4 {
    public static int COUNT = 44;
    static {
        System.out.println("Initable4初始化");
    }
}
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        System.out.println("Initable---------------");
        System.out.println(Initable.COUNT);
        System.out.println("Initable1---------------");
        System.out.println(Initable1.COUNT);
        System.out.println("Initable2---------------");
        System.out.println(Initable2.COUNT);
        System.out.println("Initable3---------------");
        Class<Initable3> clazz = Initable3.class;
        System.out.println("Initable4---------------");
        Class.forName("com.zhanghe.study.init.Initable4");
    }
}

结果:
Initable---------------
Initable初始化
457
Initable1---------------
47
Initable2---------------
Initable2初始化
56
Initable3---------------
Initable4---------------
Initable4初始化

Initable和Initable1结果分析

对于static final的值是一个编译期常量的话(如Initable1.COUNT),获取这个值时不需要对Initable1进行初始化就可以读取,如果用static final的值不是一个编译期常量(如Initable.COUNT),访问这个变量会强制对该类进行初始化

Initable2结果分析

对于一个仅仅是static修饰的字段而不是final的,在读取这个字段之前,需要为该字段分配存储空间以及初始化该存储空间

Initable3和Initable4结果分析

使用.class语法不会对类进行初始化,而使用Class.forName()来产生Class引用会直接引发类的初始化

注意:如果没有显式的编写构造器的话,java编译器会默认提供一个无参构造器,但是如果提供了自己的构造器,编译器将不会再生成默认构造器。

java基础/面向对象/4.java基础之初始化/

以上就是java基础之类初始化顺序示例解析的详细内容,更多关于java类初始化的资料请关注脚本之家其它相关文章!

相关文章

  • jar包打包成exe安装包的实现

    jar包打包成exe安装包的实现

    本文主要介绍了jar包打包成exe安装包的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 剖析SpringCloud Feign中所隐藏的坑

    剖析SpringCloud Feign中所隐藏的坑

    这篇文章主要为大家介绍了剖析SpringCloud Feign中所隐藏的坑示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • JPA配置方式+逆向工程映射到Entity实体类

    JPA配置方式+逆向工程映射到Entity实体类

    这篇文章主要介绍了JPA配置方式+逆向工程映射到Entity实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java Swing实现自定义窗口CusFrame

    Java Swing实现自定义窗口CusFrame

    文章介绍了自定义Swing窗口CusFrame的核心功能,包括移除系统默认标题栏、实现圆角矩形形状、支持拖拽移动和调整大小、多屏幕适配以及窗口状态管理等功能,最后文章提供了使用示例和注意事项,有需要的小伙伴可以参考下
    2026-05-05
  • Java 其中翻转字符串的实现方法

    Java 其中翻转字符串的实现方法

    这篇文章主要介绍了Java 其中翻转字符串的实现方法,需要的朋友可以参考下
    2014-02-02
  • Java编程接口调用的作用及代码分享

    Java编程接口调用的作用及代码分享

    这篇文章主要介绍了Java编程接口调用的作用及代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 很多人竟然不知道Java线程池的创建方式有7种

    很多人竟然不知道Java线程池的创建方式有7种

    本文主要介绍了很多人竟然不知道Java线程池的创建方式有7种,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Spring实战之获得Bean本身的id操作示例

    Spring实战之获得Bean本身的id操作示例

    这篇文章主要介绍了Spring实战之获得Bean本身的id操作,结合实例形式分析了spring获取Bean本身id的相关配置与实现技巧,需要的朋友可以参考下
    2019-11-11
  • Java String中移除空白字符的多种方式汇总

    Java String中移除空白字符的多种方式汇总

    这篇文章主要给大家介绍了关于Java String中移除空白字符的多种方式,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java 实现数组扩容与缩容案例

    java 实现数组扩容与缩容案例

    这篇文章主要介绍了java 实现数组扩容与缩容案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论