打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java惰性初始化

初始化有效地实现了尽可能的惰性。仅使用.class语法来获得对类的引用不会引发初始化。但是为了产生Class引用,Class.forName()

立即就进行了初始化


如果一个static final值是编译期常量,那么这个值就不需要对类进行初始化就能获取,但是如果将一个域设置成static和final的,还不足

以确保这种行为,对它的访问就会强制进行类的初始化,因为他不是一个编译期常量


如果一个static域不是final的,那么在对他访问时,总是要求她在被读取之前,要先进行链接(为这个域分配存储空间)和初始化(初始化

该存储空间)


为了使用类而做的准备工作包含三个步骤:

1.加载,这是由类加载器执行的。该步骤将查找字节码(通常在classpath所指定的路径中查找,但这并非必须的),并从这些字节码中创建一个Class对象。

2.链接,在链接阶段将验证类的字节码,为静态域分配存储空间,并且如果必须的话,将解析这个类创建的对其他类的所有引用。

3.初始化,如果该类具有超类,则对其进行初始化,初始化静态域和静态初始化块。


初始化被延迟到对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才执行。


  1. /** 
  2.  *  
  3.  */  
  4. package com.runtech;  
  5.   
  6. import java.util.Random;  
  7.   
  8. public class Demo002 {  
  9.     public static Random random = new Random(47);  
  10.     public static void main(String[] args) {  
  11.         Class c1 = Initable1.class;//不会初始化  
  12.         System.out.println(Initable1.staticFinal01);//编译期常量  
  13.         System.out.println(Initable1.staticFinal02);//强制类的初始化,非编译期常量  
  14.         System.out.println("-----------------------------------");  
  15.         try {  
  16.             Class c2 = Class.forName("com.runtech.Initable1");//直接就初始化了  
  17.             System.out.println(Initable2.staticFinal01);  
  18.             System.out.println(Initable2.staticFinal02);  
  19.         } catch (ClassNotFoundException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.         System.out.println("-----------------------------------");  
  23.           
  24.         Class c3 = Initable3.class;  
  25.         System.out.println(Initable3.staticFinal01);//非编译期常量  
  26.         System.out.println(Initable3.staticFinal02);  
  27.         System.out.println("-----------------------------------");  
  28.         new Initable2();  
  29.         System.out.println(Initable2.staticFinal01);  
  30.         System.out.println(Initable2.staticFinal02);  
  31.     }  
  32. }  
  33.   
  34. class Initable1 {  
  35.     static final int staticFinal01 = 47;  
  36.     static final int staticFinal02 = Demo002.random.nextInt(1000);  
  37.     static {System.out.println("Initable1 static");}  
  38.       
  39.     public Initable1() {  
  40.         System.out.println("Initable1 Constructor");  
  41.     }  
  42. }  
  43.   
  44. class Initable2 {  
  45.     static int staticFinal01 = 12;  
  46.     static final int staticFinal02 = Demo002.random.nextInt(1000);  
  47.     static {System.out.println("Initable2 static");}  
  48.       
  49.     public Initable2() {  
  50.         System.out.println("Initable2 Constructor");  
  51.     }  
  52. }  
  53.   
  54. class Initable3 {  
  55.     static int staticFinal01 = 12;  
  56.     static final int staticFinal02 = Demo002.random.nextInt(1000);  
  57.     static {System.out.println("Initable3 static");}  
  58.       
  59.     public Initable3() {  
  60.         System.out.println("Initable3 Constructor");  
  61.     }  
  62. }  


输出 :

47
Initable1 static
258
-----------------------------------
Initable2 static
12
555
-----------------------------------
Initable3 static
12
693
-----------------------------------
Initable2 Constructor
12
555

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java类中各种静态变量的加载顺序的学习
关于Class对象的作用与产生
Class.forName()与xxx.class的区别
初始化
Java面试中经常问到的算法题 - - JavaEye技术网站
解决猜数问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服