java Class与静态初始化

package com.henry.classloader;

import java.util.Random;

class Init{
 //编译时就可以确定下面常量的值,所以加载(使用"类名.class,Class.forName")Class时不进行初始化
 //并且对静态常数值的引用也不会导致初始化 操作
 static final int staticFinal=47;
 static final int staticFinal2=2;
 static{
  System.out.println("Init");
 }
};

class Init2{
 //加载(使用"类名.class")Class时不进行初始化,初始化操作延迟到对静态方法(构造器隐式静态)或者是非常数静态域的首次引用
 //对非常数静态域初次使用时先进行链接(分配存储空间),再进行初始化
 //加载使用(Class.forName)Class时,立刻进行初始化
 static int staticNonFinal=74;
 static{
  //先执行下述语句,再打印出上述静态变量
  System.out.println("init2");
 }
}

class Init3{
 static int staticNonFinal=74;
 static{
  System.out.println("init3");
 }
}

public class ClassTest4 {
 public static Random random=new Random(47);
 public static void main(String[] args)throws Exception {
  Class initClass=Init.class;
  System.out.println("after creating init ref");
  
  System.out.println(Init.staticFinal);
  System.out.println(Init.staticFinal2);
  
  System.out.println(Init2.staticNonFinal);
  
  //使用“类名.class"方法产生的Class不会进行初始化,初始化操作延迟到对静态方法(构造器隐式静态)或者是非常数静态域的首次引用
//  Class initClass3=Init3.class;
  Class initClass3=Class.forName("com.henry.classloader.Init3");
  System.out.println("after creating init3 ref");
  
  
  System.out.println(Init3.staticNonFinal);
 }
}



你可能感兴趣的:(java)