Final关键字对JVM类加载器的影响[转帖]_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3517 | 回复: 0   主题: Final关键字对JVM类加载器的影响[转帖]        下一篇 
lynda
注册用户
等级:上尉
经验:570
发帖:49
精华:0
注册:2012-8-7
状态:离线
发送短消息息给lynda 加好友    发送短消息息给lynda 发消息
发表于: IP:您无权察看 2012-8-8 17:12:41 | [全部帖] [楼主帖] 楼主

当一个类中有声明为static final的变量,这样的变量对类的加载器有一定的影响,首先看看下面的例子。

  1. package com.bird.classLoad;  
  2. class FinalTest{  
  3.    
  4.  public static final int a = 6/3;  
  5.    
  6.  static{  
  7.  System.out.println("FinalTest static block");  
  8.  }  
  9. }  
  10. public class Test3 {  
  11.  public static void main(String[] args) {  
  12.  System.out.println(FinalTest.a);  
  13.  }  
  14. }  

因为a是static final变量,且它等于6/3,在编译的时候就可以知道它的值,所以直接访问a的值不会引起FinalTest类的初始化。作为表现,也就是static静态代码快不会被加载。

运行结果为

在看一个例子

  1. package com.bird.classLoad;  
  2. import java.util.Random;  
  3. class FinalTest4{  
  4.    
  5.  public static final int a = new Random().nextInt(100);  
  6.    
  7.  static{  
  8.  System.out.println("FinalTest4 static block");  
  9.  }  
  10. }  
  11. public class Test4 {  
  12.  
  13.  public static void main(String[] args) {  
  14.  System.out.println(FinalTest4.a);  
  15.  }  
  16. }  

这个static final变量a因为i在编译的时候无法知道它的确切的值,所以只有等到运行的时候才能知道,所以自己访问FinalTest4.a会引起FinalTest4类的初始化。也就是static静态代码快的加载。

运行结果为

  1. FinalTest4 static block  
  2. 82 

下面的例子是讲,当子类被主动访问的时候,会引起其直接父类的初始化

  1. package com.bird.classLoad;  
  2. class Parent{  
  3.    
  4.  static int a = 3;  
  5.    
  6.  static{  
  7.  System.out.println("Parent static block");  
  8.  }  
  9. }  
  10. class Child extends Parent{  
  11.    
  12.  static int b = 4;  
  13.  static{  
  14.  System.out.println("Chind static block");  
  15.  }  
  16. }  
  17. public class Test5 {  
  18.    
  19.  public static void main(String[] args) {  
  20.  System.out.println(Child.b);  
  21.    
  22.  }  
  23. }  

因为直接访问Child,b,会先初始化Parent类,然后初始化Child类。

运行结果为

  1. Parent static block  
  2. Chind static block  

如果通过子类直接访问父类的变量,只会初始化父类而不会初始化子类

  1. package com.bird.classLoad;  
  2. class Parent{  
  3.    
  4.  static int a = 3;  
  5.    
  6.  static{  
  7.  System.out.println("Parent static block");  
  8.  }  
  9. }  
  10. class Child extends Parent{  
  11.    
  12.  static{  
  13.  System.out.println("Chind static block");  
  14.  }  
  15. }  
  16. public class Test5 {  
  17.    
  18.  public static void main(String[] args) {  
  19.  System.out.println(Child.a);  
  20.    
  21.  }  
  22. }  

直接访问Parent类的a变量,则只会直接初始化parent类,不会初始化Child类

运行结果如下

  1. Parent static block
  2. 3




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论