对于Java类加载过程中的顺序问题探究
2023-03-14 22:55:57 时间
以前记得static代码块貌似是Java类加载过程中优先级最高的,但是最近几天写代码发现不是这样的,因为static变量的优先级要比static代码块高得多,所以因此我犯了不少错误,下面以一个例子来说明一下一个类初始化为对象的时候的加载过程:
- package com.bird.jdbc;
- public class Test {
- private static A a = new A();
- private final static F f= new F();
- private B b = new B();
- static{
- System.out.println("c");
- }
- public Test(){
- System.out.println("Test");
- }
- public static void main(String[] args){
- // Test t = new Test();
- try {
- Class.forName("com.bird.jdbc.Test");
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- class A{
- public A(){
- System.out.println("A");
- }
- }
- class B{
- public B(){
- System.out.println("B");
- }
- }
- class F{
- public F(){
- System.out.println("F");
- }
- }
大家可以看到,直接运行Test t = new test();这句话,运行结果为
- A
- F
- c
- B
- Test
所以是先static变量,然后是static的代码块,然后才是普通变量,最后是构造函数
如果是运行Class.forName()函数的话,运行结果为
- A
- F
- c
还是这样,先是static变量,然后才是static代码块,所以那种对于class.Forname加载类,只调用static代码块的误区要克服,因为还有一个static代码块在等着你,呵呵,我得记录下来以示警戒。
原文链接:http://blog.csdn.net/a352193394/article/details/7255277
【编辑推荐】
相关文章
- 深度解读ASP.NET 5 & MVC6
- Java程序员新手老手都离不开八大开发工具
- 哪些因素影响Java调用的性能?
- JFinal 2.0 发布,JAVA 极速 WEB+ORM 框架
- Go 摆脱了 C,又惹上了 Java?
- 让你的 PHP 7 更快 (GCC PGO)
- Java 8默认方法会破坏你的(用户的)代码
- 我要阻止做java开发的男朋友去创业型公司工作吗?
- 8个超实用的Java测试工具和框架
- 十个精妙的Java编码最佳实践
- 几个面试经典算法题Java解答
- Java 9许愿清单:请赐予我们更理想的垃圾回收机制
- 态牛-Tech Neo 10月刊:并发优化
- 帮你学习Java语言的游戏
- 聊聊Java中的四种单例模式
- Maven实战
- Springboot注册Servlet几种方式你都知道?内部实现原理解析
- 优化 Golang 分布式行情推送的性能瓶颈
- 面向Java开发人员的十种测试框架库
- 关于Java代码优化的N条建议!