• 静态代码块和构造代码块


     构造代码块

    随着对象的加载而加载,创建对象的时候执行
    1、构造代码块在创建对象时被调用,每次创建对象都会调用一次
    2、构造代码块优先于构造函数执行,同时构造代码块的运行依赖于构造函数
    3、构造代码块在类中定义

    静态代码块

    静态块:用static申明,JVM加载类时执行,仅执行一次

    静态代码随着类的加载而加载,
    调用类的时候执行,
    不需要实例化类就能被加载.
    常用来执行类属性的初始化,
    不能访问普通变量
    1. class AA {
    2. //随着对象的加载而加载,创建对象的时候执行
    3. //1、构造代码块在创建对象时被调用,每次创建对象都会调用一次
    4. //2、构造代码块优先于构造函数执行,同时构造代码块的运行依赖于构造函数
    5. //3、构造代码块在类中定义
    6. {
    7. System.out.println("构造代码块");
    8. }
    9. //静态代码随着类的加载而加载,
    10. // 调用类的时候执行,
    11. // 不需要实例化类就能被加载.
    12. // 常用来执行类属性的初始化,
    13. //不能访问普通变量
    14. static {
    15. System.out.println("静态代码");
    16. }
    17. public static void main(String[] args) {
    18. System.out.println("main");
    19. AA aa = new AA();//把这个注释掉,构造代码块就不会执行
    20. }
    21. }

    执行顺序为:静态代码块-----main------构造代码块

    将new AA();注销则构造代码块不会执行。


    这样的情况 首先会执行静态类,然后创建实例化对象,执行构造代码块

    1. class AA {
    2. //这样的情况 首先会执行静态类,然后创建实例化对象,执行构造代码块
    3. static public AA a = new AA();
    4. {
    5. System.out.println("构造代码块,再执行静态代码");
    6. }
    7. static {
    8. System.out.println("静态代码");
    9. }
    10. public static void main(String[] args) {
    11. System.out.println("main");
    12. AA aa = new AA();
    13. }
    14. }
    15. 输出:
    16. 构造代码块,再执行静态代码
    17. 静态代码
    18. main
    19. 构造代码块,再执行静态代码

     最终理解

    1. 有继承的先执行基类

    2. 静态类实例化早于静态代码块

    3. 静态类实例化,后续接着执行构造代码块构造函数

    3. 静态代码块只执行一次

    4. 静态代码块执行早于main函数

    5. 子类实例化的时候,执行基类初始化

    1. /**
    2. * @运行结果:
    3. * A的构造代码块
    4. * A的构造方法
    5. * A的静态代码块
    6. * A的构造代码块
    7. * A的构造方法
    8. * A的构造代码块
    9. * A的构造方法
    10. * B的构造代码块
    11. * B的构造函数
    12. * B的静态代码块
    13. * main
    14. * A的构造代码块
    15. * A的构造方法
    16. * A的构造代码块
    17. * A的构造方法
    18. * B的构造代码块
    19. * B的构造函数
    20. */
    21. class ClassA{
    22. public static ClassA classA = new ClassA();//1 静态基类实例化对象,运行基类,输出(A的构造代码块,A的构造方法)
    23. {
    24. System.out.println("A的构造代码块");//生成classA对象时执行
    25. }
    26. static {
    27. System.out.println("A的静态代码块");//2.输出A的静态代码块,只执行一次
    28. }
    29. public ClassA(){
    30. System.out.println("A的构造方法");//生成ClassA对象时执行
    31. }
    32. }
    33. class ClassB extends ClassA{
    34. public ClassA classA = new ClassA();//生成ClassB对象时执行,输出(A的构造代码块,A的构造方法)
    35. public static ClassB classB = new ClassB();//3. 静态子类实例化对象,要牵扯到基类。输出(基类的:A的构造代码块,A的构造方法,生成ClassB对象时执行的:A的构造代码块,A的构造方法,后续执行:B的构造代码块,B的构造函数)
    36. {
    37. System.out.println("B的构造代码块");
    38. }
    39. static {
    40. System.out.println("B的静态代码块");// 4. B的静态代码块,只执行一次
    41. }
    42. public ClassB(){
    43. System.out.println("B的构造函数");
    44. }
    45. public static void main(String[] args) {
    46. System.out.println("main");//5 输出main
    47. new ClassB();//6 输出输出(基类的:A的构造代码块,A的构造方法,生成ClassB对象时执行的:A的构造代码块,A的构造方法,后续执行:B的构造代码块,B的构造函数
    48. }
    49. }

  • 相关阅读:
    前端基础建设与架构11 Tree Shaking:移除 JavaScript 上下文中的未引用代码
    关于hiveonSpark的错误问题
    电机与拖动 - 7 直流电机
    CMake中list的使用
    还不会用springboot写接口?快看这里,手把手操作,一发入魂~
    MYSQL一站式学习,看完即学完
    【餐厅点餐平台|三】模块设计
    chatgpt
    Docker下Redis集群伸缩
    教你手撕MybatisPlus分页原理
  • 原文地址:https://blog.csdn.net/qq_41950447/article/details/127741760