我是靠谱客的博主 辛勤路人,最近开发中收集的这篇文章主要介绍Java 代码执行的优先级,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java 静态代码块>构造代码块>构造方法 的执行顺序

类 成 员 (静态代码块):

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行。

实例成员(构造代码块):

没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。

执行构造器(构造方法):

执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步:
    1,super语句,可能出现以下三种情况:
        1)构造方法体的第一行是this语句,则不会执行隐式三步,
        2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,
        3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;
    2,初始化非静态变量;
    3,构造代码块。

由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行

例如,分析下面的代码及执行结果,已经用注释标出了执行步骤Step 1–Step 7。
也就是说,当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!

/**
 * Java代码块优先级测试
 */
public class Test {

    public static int num = 0;

    public static void main(String[] args) {
        Test test = null;// JVM加载Test类,静态代码块执行,或者默认运行
        System.out.println("下面开始new一个Test实例:");
        test = new Test();
    }

    // ********************************** 不new也调用 ********************************

    //静态代码块
    static {// --------------------------------------------------------------Step 1
        num = 10;
        System.out.println("Step 1 a === "+ num);
    }

    // ********************************** new 才调用   ********************************

    //非静态代码块  或  构造代码块
    {      // ---------------------------------------------------------------Step 4
        num = 8;
        System.out.println("Step 4 === "+"非静态代码块(构造代码块)在执行a=" + num);
    }

    //构造方法-无参
    public Test() {
        this("调用无参构造方法1,a=" + num); // --------------------------------Step 2
        System.out.println("Step 7 === "+"无参构造方法在执行a=" + num);// ------Step 7
    }

    //构造方法-一参
    public Test(String str) {
        this(str,"调用带参构造方法2,a=" + num); // ----------------------------Step 3
        System.out.println("Step 6 === "+"带参构造方法1在执行a=" + num); // ----Step 6
    }

    //构造方法-二参
    public Test(String str1, String str2) {
        System.out.println("Step 5 === "+str1 + ";" + str2);// --------------Step 5
    }
}

以下是运行结果:

Step 1 a === 10
下面开始new一个Test实例:
Step 4 === 非静态代码块(构造代码块)在执行a=8
Step 5 === 调用无参构造方法1a=10;调用带参构造方法2a=10
Step 6 === 带参构造方法1在执行a=8
Step 7 === 无参构造方法在执行a=8

最后

以上就是辛勤路人为你收集整理的Java 代码执行的优先级的全部内容,希望文章能够帮你解决Java 代码执行的优先级所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部