反射(分析类初始化)
什么时候会发生类初始化:
1)new的时候
2)使用反射的时候
3)当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
测试:
1 package reflection; 2 3 4 import org.w3c.dom.ls.LSOutput; 5 6 import java.nio.file.FileSystemAlreadyExistsException; 7 8 // 测试类声明时候会初始化 9 public class Test06 { 10 static { 11 System.out.println("Main类被加载"); 12 } 13 public static void main(String[] args) { 14 Son son = new Son(); 15 } 16 17 } 18 19 class Father { 20 static int b = 2; 21 static { 22 System.out.println("父类被加载"); 23 } 24 } 25 26 class Son extends Father { 27 static { 28 System.out.println("子类被加载"); 29 m = 300; 30 } 31 32 static int m = 100; 33 static final int M = 1; 34 }
结果:
Main类被加载
父类被加载
子类被加载
1 Class.forName("reflection.Son");
结果:
Main类被加载
父类被加载
子类被加载
不会发生类初始化情况:
1)子类去调用父类的静态变量,不会导致子类初始化
1 System.out.println(Son.b);
结果:
Main类被加载
父类被加载
2
2)通过数组定义类引用,不会触发此类的初始化
1 Son[] sons = new Son[5];
结果:
Main类被加载
3)引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
1 System.out.println(Son.M);
结果:
Main类被加载
1
posted on 2021-04-11 20:21 Love&Share 阅读(143) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~