静态代码块,构造代码块,构造函数,局部代码块的执行顺序

目录


本文参考自: https://www.cnblogs.com/ysocean/p/8194428.html#_label1

1. 静态代码块

1.1 格式

java">class Demo {
    static {
        System.out.println("静态代码块1");
    }

    static {
        System.out.println("静态代码块2");
    }
}

1.2 静态代码块的执行时机

java">package cn.king.demo01;
/**
 * 静态代码块的执行时机与执行顺序
 */
class Demo {
    static {
        System.out.println("静态代码块1");
    }

    static {
        System.out.println("静态代码块2");
    }

    static {
        System.out.println("静态代码块3");
        // 在静态代码块中能调用静态方法
        // -- 调用本类的静态方法
        fun1();
        // -- 调用其他类中的静态方法
        Demo02.fun3();
    }

    public static void fun1() {
        System.out.println("Demo类中的静态方法fun1");
    }

    public void fun2() {
        System.out.println("成员方法fun2");
    }
}


class Demo02{
    public static void fun3() {
        System.out.println("Demo02类中的静态方法fun3");
    }
}

public class Demo01 {
    public static void main(String[] args) {
        Demo demo = new Demo();
        /*
         * 输出:
         * 静态代码块1
         * 静态代码块2
         * 静态代码块3
         * Demo类中的静态方法fun1
         * Demo02类中的静态方法fun3
         */
    }
}
  • 注意: 静态的只能访问静态的.

1.3 静态代码块的作用

  • 给静态变量赋值.
  • 将只需要执行一次的代码放到静态代码块中, 例如驱动加载.
  • 有一些代码需要项目启动时就执行, 可以将这些代码放到静态代码块中, 例如项目启动需要加载很多配置文件, 加载配置文件的代码就可以放在静态代码块中.

2. 构造代码块

2.1 格式

java">// {} 放到成员位置叫构造代码块;  {} 放到局部位置叫做局部代码块(基本没用)
class Demo {
    {
        System.out.println("构造代码块01");
    }

    {
        System.out.println("构造代码块02");
    }

    public Demo() {
    }
}

2.2 构造代码块的执行时机

java">class Demo {
    private String name;
    
    {
        System.out.println("构造代码块01");
    }

    {
        System.out.println("构造代码块02");
    }

    public Demo() {
        System.out.println("无参构造被调用");
    }

    public Demo(String name) {
        System.out.println("有参构造被调用");
        this.name = name;
    }
}

// --------- 上述的代码反编译后如下 ------------

class Demo {
    private String name;
    
    public Demo() {
        System.out.println("构造代码块01");
         System.out.println("构造代码块02");
        System.out.println("无参构造被调用");
    }

    public Demo(String name) {
        System.out.println("构造代码块01");
         System.out.println("构造代码块02");
        System.out.println("有参构造被调用");
        this.name = name;
    }
}

2.3 构造代码块的作用

  • 构造函数类似, 构造代码块也能对对象进行初始化.
  • 每次创建对象, 都会执行所有的构造代码块; 每次创建对象, 都会执行一个重载的构造方法;
    利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以做诸如统计创建对象的次数等功能;

3. 构造方法

  • 构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
  • 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用 ;
  • 构造函数的作用主要是创建对象时对对象进行初始化(给对象的成员变量赋值);

4. 普通代码块

java">class Demo {
    private String name;

    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("构造代码块");
    }

    public void fun1() {
        {
            System.out.println("局部代码块");
        }
    }
}

5. 执行顺序

java">class Demo {
    static {
        System.out.println("静态代码块");
    }

    {
        System.out.println("构造代码块");
    }

    public Demo() {
        System.out.println("构造函数");
    }

    public void fun1() {
        {
            System.out.println("局部代码块");
        }
    }
}

public class Demo01 {
    public static void main(String[] args) {
        Demo demo01 = new Demo();
        demo01.fun1();
        /*
         * 输出:
         * 静态代码块
         * 构造代码块
         * 构造函数
         * 局部代码块
         */
        
        System.out.println("--------");
        
        Demo demo02 = new Demo();
        demo02.fun1();
        /*
         * 输出:
         * 构造代码块
         * 构造函数
         * 局部代码块
         */
    }
}

// 注意静态代码块只会在第一次创建对象时执行一次. 

6. 父子类执行顺序

  • 首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块,父类的构造代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有构造代码块,如果有就执行子类的构造代码块。子类的构造代码块执行完毕再去执行子类的构造方法。

    总之一句话,静态代码块内容先执行,接着执行父类构造代码块和构造方法,然后执行子类构造代码块和构造方法。

java">package cn.king.demo01;

class SuperClass {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类构造代码块");
    }

    public SuperClass() {
        System.out.println("父类构造方法");
    }
}

class SubClass extends SuperClass {
    static {
        System.out.println("子类静态代码块");
    }

    {
        System.out.println("子类构造代码块");
    }

    public SubClass() {
        System.out.println("子类构造方法");
    }
}

public class Demo01 {
    public static void main(String[] args) {
        SubClass subClass01 = new SubClass();
        System.out.println("-------");
        SubClass subClass02 = new SubClass();

        /*
         * 输出:
         * 父类静态代码块
         * 子类静态代码块
         * 父类构造代码块
         * 父类构造方法
         * 子类构造代码块
         * 子类构造方法
         * -------
         * 父类构造代码块
         * 父类构造方法
         * 子类构造代码块
         * 子类构造方法
         */
    }
}

http://www.niftyadmin.cn/n/860790.html

相关文章

框架中配置文件加载的原理

目录1. 框架中加载配置文件的方式的概述2. 通过IO流结合Properties加载配置文件2.1 Properties类概述2.2 Properties作为Map集合使用2.3 Properties的特殊功能2.4 Properties和IO结合使用3. 通过ServletContext对象的获取项目中的任意文件的绝对路径4. 通过类加载器来管理资源和…

SpringBoot学习笔记16——MybatisPlus修改时空字段不修改

问题描述: 今天遇到了一个问题,在更新数据时,MybatisPlus不会进行修改属性为空的数据表字段。 解决办法: 只需要在实体类的属性上加一行注释即可 /*** 姓名*/TableField(fill FieldFill.UPDATE)private String name; 这行注释…

Java中String类的基本使用

目录1. String概述3. 字符串一旦赋值就不能被改变3. 字符串字面值对象和构造方法创建的对象的区别4. 常量优化机制5. String中的常用方法5.1 String的判断功能5.2 String的获取功能5.3 String的转换功能5.4 String的其他功能5.4.1 替换功能5.4.2 去除字符串首尾空格5.4.3 按字典…

Java基础学习02——通过泛型获得Class,类似T.class

今天写代码遇到了一个问题&#xff0c;我需要在通过泛型T获取它的class&#xff0c;但是T.class不能用&#xff0c;所以才有了一下内容。 话不多说直接上代码 public abstract class BaseController<S extends BaseService<T> , T extends BaseEntity , V extends Ba…

SpringBoot学习笔记17——解决application.properties文件不生效的问题

今天遇到了一个问题&#xff0c;坑了我好久。 先看异常 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2018-11-13 22:43:21.076 ERROR 3044 --- [ main] o.s.b.d.LoggingFailureAnalysisRep…

日常挖坑01——项目启动rabbitmq报错

今天由于眼瞎自己又挖了一个坑&#xff0c;在项目启动时连接mq报错如下&#xff1a; org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN…

Java中StringBuffer类的基本使用

目录1. java.lang.StringBuffer类概述2. StringBuffer和String的区别3. StringBuffer的常用构造方法4. StringBuffer的常用成员方法4.1 添加功能4.2 删除功能4.3 替换功能4.4 翻转功能4.5 截取功能4.6 其他功能5. 注意6. java.lang.StringBuilder类概述7. 关于StringBuffer的题…

Linux学习笔记02——Linux基本入门指令

今天来记录一下Linux的基本指令 1.目录操作 创建目录 mkdir $HOME/testFolder 切换目录 cd $HOME/testFolder cd ../ 移动目录 mv $HOME/testFolder /var/tmp 删除目录 rm -rf /var/tmp/testFolder 查看目录下的文件 ls /etc 2.文件操作 创建文件 使用 touch 命令创建文件 …