Java 静态代码块、构造方法和类加载顺序解析
Java 静态代码块、构造方法和类加载顺序解析
本文将深入探讨Java中的静态代码块、构造方法和类加载顺序,并解释为什么代码中没有输出'这是学生方法'和'这是构造方法'。
代码示例:
public class personStatic {
/*
2. personStatic 的类加载过程中,执行静态代码块
*/
static{
System.out.println('这是静态代码块执行');
}
public personStatic() {
System.out.println('这是构造方法');
}
static class student {
public student() {
System.out.println('这是学生方法');
personStatic personStatic = new personStatic();
}
}
// 1.启动main方法触发PersonStatic类的类加载
public static void main(String[] args) {
// 3. 类加载结束后,启动main方法
System.out.println('这是main方法');
// 4. 创建student类 非静态上下文 无法访问 静态上下文
student s = new student();
}
}
// 输出结果
// 这是静态代码块执行
// 这是main方法
// 这是学生方法
// 这是构造方法
代码分析:
-
类加载顺序: 当程序执行
main方法时,首先会触发PersonStatic类的类加载。在这个过程中,静态代码块会被执行,因此会输出'这是静态代码块执行'。 -
静态代码块: 静态代码块在类加载时执行,并且只执行一次。代码中的静态代码块打印了'这是静态代码块执行'。
-
构造方法: 构造方法在创建对象时被调用。在代码中,
student类创建对象时,会调用student类的构造方法,从而打印'这是学生方法'。同时,student类的构造方法中创建了personStatic类的对象,因此调用了personStatic类的构造方法,打印'这是构造方法'。 -
非静态上下文:
student类是一个非静态内部类,它不能直接访问personStatic类的静态成员。不过,student类可以通过创建personStatic类对象来调用其非静态成员(包括构造方法)。
错误分析:
在原始代码中,构造方法被错误地定义为一个方法,导致构造方法无法被调用。将构造方法的定义修改为正确的形式后,输出结果将会包含'这是学生方法'和'这是构造方法'。
总结:
- 静态代码块在类加载时执行,并且只执行一次。
- 构造方法在创建对象时被调用。
- 非静态上下文无法直接访问静态上下文,但可以通过创建对象的方式间接访问。
希望本文能够帮助您理解Java中的静态代码块、构造方法和类加载顺序。如果您有任何问题或建议,请随时提出。
原文地址: https://www.cveoy.top/t/topic/qkpN 著作权归作者所有。请勿转载和采集!