关于java 类的生命周期 深入了解

package com.easyway.commons.ispace.dev.oop.classloaders;
/**
 * 类的生命周期从类被加载,连接和初始化开始,到被卸载结束。只有当类处于生命周期中时,
 * 程序才能使用这个类:如访问它的静态成员,创建它的实例。
 * 加载过程负责把类的二进制数据读入到java虚拟机的方法区,并且在堆区内创建一个描述
 * 这个类的class对象。连接过程负责验证类的二进制数据,为静态变量分配内存并且初始化
 * 默认值,把字节码流中的符号引用替换为直接引用。初始化过程负责执行类的初始化语句,
 * 为静态变量赋予初始值。
 * 关于类的生命周期:
 * java 虚拟机初始化一个类:
 *   (1) 如果这个类没被加载和连接,那就进行加载和连接。
 *   (2)  如果累存在直接的父类,并且这个父类还没有被初始化,那就先初始化直接的父类。
 *   (3) 如果类存在初始化语句,那就一次执行这些初始化语句。
 *   备注:如果这个类的父类,有相关的父类,也执行上面的步骤。
 * @author longgangbai
 * @date 2010-5-7
 * @version 1.0
 * @since JDK6.0
 */
class Base{
 static int a=1;
 static{
  System.out.println("init base  static ");
 }
}
class Sub extends Base{
 static int b=1;
 
 static{
  System.out.println("init Sub  static");
 }
}
public class ClassLifeLine {
 /**
  * 静态变量的初始化:
  * (1)在静态变量的声明处进行初始化
  * (2)在静态代码块中进行初始化
  */
 private static final int a=1;
 private static final int b=(4*10)/10; 
 
 private static final long c;
 private static long d;  //静态变量没有显示初始化,它将保持默认值0
 
 public ClassLifeLine(){
  System.out.println("类的构造中》...");
 }
 /**
  * 静态变量的声明语句,以及静态代码块都被看作类的初始化语句。
  * java 虚拟机会按照初始化语句在类文件中的先后顺序依次执行他们。
  */
 static{
  c=3;
  System.out.println(" ClassLifeLine ,这是一个static 的语句块");
 }
 /**
  * main 方法执行过程如下:
  *   java 虚拟机首先初始化启动ClassLifeLine ,
  *   然后执行它的main方法,当访问Sub.b 时,先依次初始化Base 类和 Sub类
  *  
  * @param args
  */
 public static void main(String[] args) {
   
  //=======================仅仅执行下面代码结果如下:==========================//
  //=======================ClassLifeLine ,这是一个static 的语句块============//
  //======================= init base  static ============================//
  //======================= init Sub  static==============================//
  //=======================Sub.b = 1 =====================================//
  //=======================ClassLifeLine d =0 ============================//
  //=======================ClassLifeLine b =3=============================//
  //=======================ClassLifeLine b =4=============================//
/*  
  System.out.println("Sub.b = "+Sub.b);
  System.out.println(" ClassLifeLine d ="+d);
  System.out.println(" ClassLifeLine c ="+c);
  System.out.println(" ClassLifeLine b ="+b);*/
  
  
  
  
  /**
   * 单独执行如下代码打印结果如下::
   * after defining base   说明:仅仅声明是不会初始化
   * init base  static    说明:在初始化时开始加载初始化语句(静态语句块,静态声明语句)
   * after create an object of base  
         * a =1
   * init Sub  static   说明:在父类存在的情况下,如果父类没有加载连接,那么加载连接。
    * b = 1
   *
   */
  Base base;
  System.out.println("after defining base ");
  base=new Base();
  System.out.println("after create an object of base  ");
  System.out.println("a ="+base.a);
  System.out.println(" b = "+Sub.b);
  
  
  
  
 }

}

你可能感兴趣的:(java,C++,c,虚拟机,C#)