• Java之static静态代码块


    Java之static静态代码块

    构造代码块

    使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域

    public class HelloA {
        /**
        ...
        */
        {
            System.out.println("I'm A construct code block");
        }
    
    }
    
    
    

    构造函数代码块

    构造函数代码块指的是构造函数中所包含的代码,类似 className(){}中的代码块

    public class HelloA {
        public HelloA(){
            System.out.println("I'm A construct method code block");
        }
    }
    
    
    

    static代码块

    static代码块指的是static{}包裹的代码块,且静态代码只执行一次,可以通过Class.forName("classPath")的方式唤醒代码的static代码块,但是也执行一次。

    public class HelloA {
        static{
            System.out.println("I'm A static code block");
        }
    
    }
    
    

    三种代码方式的执行顺序

    public class HelloA {
        public HelloA(){
            System.out.println("I'm A construct method code block");
        }
        {
            System.out.println("I'm A construct code block");
        }
    
        static {
            System.out.println("I'm A static code block");
        }
    
        public static void main(String[] args) {
            new HelloA();
            new HelloA();
    
        }
    }
    
    

    result

    I'm A static code block
    I'm A construct code block
    I'm A construct method code block
    I'm A construct code block
    I'm A construct method code block

    可以看到显示static代码初始化,然后是构造方法初始化,然后是构造函数初始化,并且静态代码只会初始化一次。

    为什么构造代码块一定在构造函数代码块前执行

    这里可以直接代码编译后的文件HelloA.class

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    public class HelloA {
       /*构造代码块直接被内联到了构造函数代码块中*/
        public HelloA() {
            System.out.println("I'm A construct code block");
            System.out.println("I'm A construct method code block");
        }
    
        public static void main(String[] args) {
            new HelloA();
            new HelloA();
        }
    
        static {
            System.out.println("I'm A static code block");
        }
    }
    
    

    因此得出结论构造代码块直接被内联到构造函数代码块中

    并且还可以推论可以直接在构造代码块中调用this或者调用this.method()或者this.staticMethod();

    加上继承的情况

    public class HelloB extends HelloA {
        {
            System.out.println("I'm A construct  code block");
        }
    
        public HelloB() {
            System.out.println("I'm A construct method code block");
        }
    
        static {
            System.out.println("I'm B static code block");
        }
    
        public static void main(String[] args) {
            new HelloB();
        }
    }
    

    result

    I'm A static code block
    I'm B static code block
    I'm A construct code block
    I'm A construct method code block
    I'm A construct code block
    I'm A construct method code block

    初始化的整体顺序可以渐进的表示为

    static > instace

    有继承初始化顺序:

    另一个静态提升的题见csdn

    https://blog.csdn.net/harryptter/article/details/87875399#笔试题

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    Windows 环境 cygwin 安装 SSH
    看见上帝的 10 个公式……
    移动平均
    分位数
    算术平均、几何平均、调和平均、平方平均和移动平均
    平均数、中位数和众数及它们之间的关系
    10 个超炫绘制图表图形的 Javascript 插件【转载+整理】
    “服务器推”技术【转载+整理】
    网站数据监控监测系统
    Active Directory 域服务(AD DS)
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524699.html
Copyright © 2020-2023  润新知