Java类的执行顺序(详解)

在Java中,类的执行顺序主要包括静态变量、静态代码块、实例变量、实例代码块、构造方法等的执行顺序

Java类的执行顺序

  1. 静态变量和静态代码块按顺序执行:在类加载时,静态变量和静态代码块按它们在类中出现的顺序依次执行。静态变量和静态代码块只在类第一次加载时执行一次。

  2. 实例变量和实例代码块按顺序执行:在创建对象时,实例变量和实例代码块按它们在类中出现的顺序依次执行。每次创建对象时,实例变量和实例代码块都会执行一次。

  3. 构造方法执行:实例变量和实例代码块执行完之后,才会执行构造方法。构造方法是在每次创建对象时执行的。

示例代码和执行顺序

简单示例

 

public class ExecutionOrder {
    // 静态变量
    static int staticVar = initStaticVar();

    // 实例变量
    int instanceVar = initInstanceVar();

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

    // 实例代码块
    {
        System.out.println("4. 实例代码块");
    }

    // 构造方法
    public ExecutionOrder() {
        System.out.println("5. 构造方法");
    }

    // 静态方法初始化静态变量
    private static int initStaticVar() {
        System.out.println("1. 静态变量初始化");
        return 0;
    }

    // 实例方法初始化实例变量
    private int initInstanceVar() {
        System.out.println("3. 实例变量初始化");
        return 0;
    }

    // 主方法
    public static void main(String[] args) {
        System.out.println("6. 创建对象1");
        new ExecutionOrder();
        
        System.out.println("\n6. 创建对象2");
        new ExecutionOrder();
    }
}

结果

1. 静态变量初始化
2. 静态代码块
6. 创建对象1
3. 实例变量初始化
4. 实例代码块
5. 构造方法

6. 创建对象2
3. 实例变量初始化
4. 实例代码块
5. 构造方法

总结

  • 静态变量和静态代码块在类加载时执行,只执行一次。

  • 实例变量和实例代码块在每次创建对象时执行。

  • 构造方法在实例代码块之后执行。

复杂示例
public class TestOrder {
    // 静态变量
    static int staticVar = initStaticVar();

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

    // 实例变量
    int instanceVar = initInstanceVar();
    int anotherInstanceVar;

    // 实例代码块
    {
        System.out.println("4. 实例代码块");
        anotherInstanceVar = 42; // 给另一个实例变量赋值
        performSomeAction(); // 调用实例方法
    }

    // 构造方法
    public TestOrder(int value) {
        System.out.println("5. 构造方法开始");

        // 在构造方法中增加静态代码块和实例代码块
        static {
            System.out.println("5.1 构造方法中的静态代码块");
        }

        {
            System.out.println("5.2 构造方法中的实例代码块");
        }

        if (value > 10) {
            this.instanceVar = value;
            System.out.println("5.3 构造方法中:值大于10,instanceVar = " + value);
        } else {
            System.out.println("5.4 构造方法中:值小于等于10");
        }

        // 调用其他方法
        anotherComplexMethod(value);

        System.out.println("5. 构造方法结束");
    }

    // 静态方法初始化静态变量
    private static int initStaticVar() {
        System.out.println("2. 静态变量初始化");
        return 0;
    }

    // 实例方法初始化实例变量
    private int initInstanceVar() {
        System.out.println("3. 实例变量初始化");
        return 0;
    }

    // 实例方法
    private void performSomeAction() {
        System.out.println("4.1 实例代码块中调用的实例方法");
    }

    // 另一个实例方法
    private void anotherComplexMethod(int value) {
        System.out.println("5.5 构造方法中调用的另一个实例方法,value = " + value);
        this.anotherInstanceVar += value;
        System.out.println("5.6 构造方法中:anotherInstanceVar = " + anotherInstanceVar);
    }

    // 主方法
    public static void main(String[] args) {
        System.out.println("6. 创建对象1");
        new TestOrder(5);

        System.out.println("\n6. 创建对象2");
        new TestOrder(15);
    }
}

执行结果:

2. 静态变量初始化
1. 静态代码块
6. 创建对象1
3. 实例变量初始化
4. 实例代码块
4.1 实例代码块中调用的实例方法
5. 构造方法开始
5.2 构造方法中的实例代码块
5.4 构造方法中:值小于等于10
5.5 构造方法中调用的另一个实例方法,value = 5
5.6 构造方法中:anotherInstanceVar = 47
5. 构造方法结束

6. 创建对象2
3. 实例变量初始化
4. 实例代码块
4.1 实例代码块中调用的实例方法
5. 构造方法开始
5.2 构造方法中的实例代码块
5.3 构造方法中:值大于10,instanceVar = 15
5.5 构造方法中调用的另一个实例方法,value = 15
5.6 构造方法中:anotherInstanceVar = 57
5. 构造方法结束

为什么5.1的构造方法中的静态代码块不输出?

执行顺序解析

  1. 类加载:静态变量和静态代码块按顺序执行,只在类加载时执行一次。

    • 静态变量 staticVar 初始化并调用 initStaticVar() 方法,输出 "2. 静态变量初始化"。

    • 静态代码块执行,输出 "1. 静态代码块"。

  2. 主方法执行:静态初始化完成后,主方法开始执行,依次创建两个对象。

  3. 创建对象1

    • 实例变量 instanceVar 初始化并调用 initInstanceVar() 方法,输出 "3. 实例变量初始化"。

    • 实例代码块执行,输出 "4. 实例代码块" 和 "4.1 实例代码块中调用的实例方法"。

    • 构造方法执行,输出 "5. 构造方法开始"、"5.2 构造方法中的实例代码块"、"5.4 构造方法中:值小于等于10"、"5.5 构造方法中调用的另一个实例方法,value = 5"、"5.6 构造方法中:anotherInstanceVar = 47" 和 "5. 构造方法结束"。

  4. 创建对象2

    • 实例变量 instanceVar 初始化并调用 initInstanceVar() 方法,输出 "3. 实例变量初始化"。

    • 实例代码块执行,输出 "4. 实例代码块" 和 "4.1 实例代码块中调用的实例方法"。

    • 构造方法执行,输出 "5. 构造方法开始"、"5.2 构造方法中的实例代码块"、"5.3 构造方法中:值大于10,instanceVar = 15"、"5.5 构造方法中调用的另一个实例方法,value = 15"、"5.6 构造方法中:anotherInstanceVar = 57" 和 "5. 构造方法结束"。

总的来说,静态代码块在类加载时执行,实例代码块在每次创建对象时执行,构造方法在实例代码块之后执行构造方法中不能包含静态代码块,实例代码块可以放在构造方法中,但它们的执行顺序仍然是按照类的初始化顺序进行。

 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA项目中,CLASSPATH是一个重要的环境变量,用于指定JAVA程序运行时需要加载的和资源文件的路径。如果CLASSPATH设置不正确,会导致无法找到文件或资源文件,从而引发程序运行异常。以下是关于JAVA项目中CLASSPATH路径的详解: 1. CLASSPATH的设置 在命令行中设置CLASSPATH的方法如下: ``` java -classpath <path1>:<path2>:<path3> <classname> ``` 其中,`<path1>`、`<path2>`、`<path3>`表示文件或资源文件所在的路径,多个路径之间用冒号分隔。`<classname>`表示要执行的名。 在Eclipse等开发工具中,可以在项目的配置中设置CLASSPATH。 2. CLASSPATH的顺序 当JAVA程序需要加载一个或资源文件时,会按照CLASSPATH中指定的顺序依次在各个路径中查找文件。如果找到了就直接加载,否则就继续查找下一个路径,直到找到该文件或查找完所有路径为止。 因此,在设置CLASSPATH时,需要注意路径的顺序。一般来说,应该将当前项目的路径放在最前面,以确保程序能够正确地加载项目中的和资源文件。 3. CLASSPATH的写法 在设置CLASSPATH时,路径的写法有以下几种: - 绝对路径:例如`/usr/local/java/lib`,表示在根目录下的`/usr/local/java/lib`路径中查找文件。 - 相对路径:例如`./lib`,表示在当前路径下的`./lib`路径中查找文件。 - 通配符:例如`./lib/*.jar`,表示在当前路径下的`./lib`路径中查找所有以`.jar`结尾的文件。 4. CLASSPATH的常见问题 在JAVA项目中,常见的CLASSPATH路径问题有以下几种: - 文件或资源文件不存在:如果CLASSPATH中指定的路径中不存在要加载的文件或资源文件,会导致程序运行异常。 - CLASSPATH顺序设置不正确:如果CLASSPATH中指定的顺序不正确,可能会导致程序加载的文件或资源文件不是期望的那个,从而引发程序运行异常。 - CLASSPATH路径中包含空格:如果CLASSPATH路径中包含空格,需要使用双引号将路径括起来,否则可能会导致程序无法正确加载文件或资源文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值