JAVA类的初始化顺序与initialize参数

简介:

JAVA类的初始化顺序依次是:(静态变量、静态初始化块)->(变量、初始化块)->构造函数,
相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次。通过下面的代码来验证。

 

 
  1. public class ClassA {  
  2.  
  3.  {  
  4.   System.out.println("Init Block!!");  
  5.  }  
  6.  
  7.  static {  
  8.   System.out.println("Static Init Block!!");  
  9.  }  
  10.  
  11.  private static ClassB sMemVariable = new ClassB(  
  12.    "Static Member Variable Inited!!");  
  13.  
  14.  public ClassA() {  
  15.   System.out.println("Constructer execute!!");  
  16.  }  
  17.  
  18.  public ClassB memVariable = new ClassB("Member Variable Inited!!");  
  19.  
  20.  public static void main(String[] args) {  
  21.   ClassA o = new ClassA();  
  22.   ClassA o2 = new ClassA();  
  23.  }  
  24. }  
  25.  
  26. public class ClassB {  
  27.  public ClassB(String mes) {  
  28.   System.out.println(mes);  
  29.  }  
  30.  
  31.  public static void main(String[] args) throws ClassNotFoundException {  
  32.   try {  
  33.    Class.forName("test.ClassA");//(1)  
  34.   } catch (Exception e) {  
  35.    }  
  36.  }  

运行ClassA输出结果为:

Static Init Block!!
Static Member Variable Inited!!
Init Block!!
Member Variable Inited!!
Constructer execute!!
Init Block!!
Member Variable Inited!!
Constructer execute!!

静态变量和静态初始化块的初始化发生在类加载完成之后。验证如下:

运行ClassB输出结果为:
Static Init Block!!
Static Member Variable Inited!!

的确如此,但这个说法并不正确,如果ClassB代码(1)处改成:
Class.forName("test.ClassA", false,ClassB.class.getClassLoader());
再次运行,就看不到输出结果了。问题再于Class.forName的第二个参数(initialize)为false,
类加载之后不执行静态变量与静态块的初始化,而把这一工作放到第一次创建对像时完成。
Class.forName("test.ClassA")方法设为initialize为true(参考JDK源码);
修改(1)处代码为Class.forName("test.ClassA", false,ClassB.class.getClassLoader()).newInstance();
就看到输出结果了。


本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/464100


相关文章
|
20小时前
|
存储 Java ice
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
8 3
|
20小时前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
8 1
|
21小时前
|
Java 编译器 C语言
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
8 3
|
21小时前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
16 4
|
2天前
|
存储 算法 搜索推荐
滚雪球学Java(27):从零开始学习数组:定义和初始化
【5月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
7 3
|
2天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
42 3
|
3天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
4天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
4天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
9 0