<clinit>()方法
Java 类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。 如果类中没有静态语句和静态代码块,那可以不生成<clinit>() 方法。
并且 <clinit>() 不需要显式调用父类(接口除外,接口不需要调用父接口的初始化方法,只有使用到父接口中的静态变量时才需要调用)的初始化方法 <clinit>(),虚拟机会保证在子类的 <clinit>() 方法执行之前,父类的 <clinit>() 方法已经执行完毕(所以java.lang.Object 类总是第一个被加载)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Father {
static int father_a = 1;
static {
System.out.println("父类静态代码块执行");
}
static class StaticInnerClass {
static {
System.out.println("静态内部类静态代码块执行");
}
}
}
class Son extends Father {
static {
System.out.println("子类静态代码块执行");
son_a = 300;
}
static int son_a = 100;
static final int M = 1;
}
|
Main方法:
1:父类没有被引用但是会被先加载
new Son();
2:反射也会产生主动引用:
Class a = Class.forName("clinit.Son");
(运行结果同1)
System.out.println("Father.a = " + Son.father_a);
Son[] sons = new Son[8];
5:使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
System.out.println("Son.CONST = " + Son.CONST);
new Father.StaticInnerClass();
代码总结:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void main(String[] args) throws Exception {
// 1.父类没有被引用但是会被先加载
// new Son();
// 2.反射会产生主动引用
// Class a = Class.forName("clinit.Son");
// 3.子类使用父类静态变量或方法不会产生类的引用
// System.out.println("Father.a = " + Son.father_a);
// 4.通过类创建数组不会加载类(只是开辟一块空间)
// Son[] sons = new Son[8];
// 5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
// System.out.println("Son.CONST = " + Son.CONST);
// 6.引用静态内部类不会加载外部类(应用于单例模式)
// new Son.StaticInnerClass();
}
}
|
PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前
|
1
2
3
4
5
6
7
|
public class Test {
public static void main(String[] args) {
System.out.println("a = " + cls.a);
}
}
class cls {
static int a = 10;8 static { a = 20; }9 }
|
如果 调换顺序输出结果将是 a = 10
|
1
2
3
4
|
class cls {
static { a = 20; }
static int a = 10;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
原文链接:https://www.cnblogs.com/whyha/p/13420219.html
相关文章
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 83
-
2025-05-25 66
-
2025-05-26 79
-
关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程
2025-05-27 54 -
2025-05-29 88









