详解Java类的生命周期

发表于:2012-5-07 10:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zhengzhb    来源:51Testing软件测试网采编

分享:

  被动引用的示例代码:

  1. class InitClass{  
  2.     static {  
  3.         System.out.println("初始化InitClass");  
  4.     }  
  5.     public static String a = null;  
  6.     public final static String b = "b";  
  7.     public static void method(){}  
  8. }  
  9.  
  10. class SubInitClass extends InitClass{  
  11.     static {  
  12.         System.out.println("初始化SubInitClass");  
  13.     }  
  14. }  
  15.  
  16. public class Test4 {  
  17.  
  18.     public static void main(String[] args) throws Exception{  
  19.     //  String a = SubInitClass.a;// 引用父类的静态字段,只会引起父类初始化,而不会引起子类的初始化  
  20.     //  String b = InitClass.b;// 使用类的常量不会引起类的初始化  
  21.         SubInitClass[] sc = new SubInitClass[10];// 定义类数组不会引起类的初始化  
  22.     }  
  23. }

  最后总结一下使用阶段:使用阶段包括主动引用和被动引用,主动饮用会引起类的初始化,而被动引用不会引起类的初始化。

  当使用阶段完成之后,java类就进入了卸载阶段。

  卸载

  关于类的卸载,笔者在单例模式讨论篇:单例模式与垃圾回收一文中有过描述,在类使用完之后,如果满足下面的情况,类就会被卸载:

  该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

  加载该类的ClassLoader已经被回收。

  该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

  如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。

  总结

  做java的朋友对于对象的生命周期可能都比较熟悉,对象基本上都是在jvm的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。读完本文后我们知道,对象的生命周期只是类的生命周期中使用阶段的主动引用的一种情况(即实例化类对象)。而类的整个生命周期则要比对象的生命周期长的多。

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号