`
shinepaopao
  • 浏览: 143234 次
社区版块
存档分类
最新评论

Final关键字对JVM类加载器的影响

    博客分类:
  • Java
阅读更多

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

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

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

运行结果为

在看一个例子

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

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

运行结果为

  1. FinalTest4 static block  
  2. 82 

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

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

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

运行结果为

  1. Parent static block  
  2. Chind static block  
  3. 4 

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

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

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

运行结果如下

  1. Parent static block
  2. 3
5
6
分享到:
评论
7 楼 chenjingbo 2013-09-27  
chenjingbo 写道
只是说了些结论性的东西,我觉得可以说具体一些.比如把linking,verification preparation 和 resolution 都介绍一下

说错了 .哈哈
6 楼 chenjingbo 2013-09-27  
只是说了些结论性的东西,我觉得可以说具体一些.比如把linking,verification preparation 和 resolution 都介绍一下
5 楼 liaozxbj 2013-09-27  
这种细节的东西还真的多积累
4 楼 arthur8 2013-09-27  
  8错
3 楼 jilo88 2013-09-27  
还真有意思,收了
2 楼 JHlTYI 2013-09-27  
这篇文章挺好啊。
1 楼 cywhoyi 2013-09-27  
被题目吸引而来,因内容而失望

相关推荐

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【JVM】双亲委派模型中,从顶层到底层,都是哪些类加载器,分别加载哪些类? 55 【JVM】能不能自己写个类叫java.lang.System? 57 【JVM】类的加载过程 58 【JVM】类的初始化 58 类什么时候才被初始化: 58 类的初始...

    疯狂JAVA讲义

    6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 对象与垃圾回收 225 6.9.1 对象在内存中的状态 226 6.9.2 强制垃圾回收 227 6.9.3 finalize方法 228 ...

    计算机(专升本)Java程序设计复习资料.doc

    A.abstract只能用来派生类,不能创建abstract类的对象 B.final修饰的类不能用来派生子类 C.abstract可与final同时修饰一个类 D.abstract方法必须在abstract类中声明,但abstract类定义中可以没有abstract方法 6....

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    6.2.4 再看final关键字 180 6.2.5 java.lang.object 181 6.2.6 关于垃圾收集 186 6.2.7 再看抽象类 189 6.3 重点复习 191 6.4 课后练习 192 chapter7 接口与多态 199 7.1 何谓接口 200 7.1.1 接口...

    JAVA面试题最全集

    描述一下JVM加载class文件的原理机制? 41.试举例说明一个典型的垃圾回收算法? 42.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44...

    java 面试题 总结

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java面试宝典2012版.pdf

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11、"=="和equals方法究竟有什么区别? 12、静态变量和实例变量的区别? 13、是否可以从一个static方法内部发出对非static方法的调用? ...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    java面试题

    53. 描述一下JVM加载class文件的原理机制? 30 54. socket编程 30 54.1. 什么是TCP/IP、UDP? 30 54.2. Socket在哪里呢? 31 54.3. Socket是什么呢? 32 54.4. socket的实现步骤 37 55. Servlet 38 55.1. Servlet工作...

    最新Java面试宝典pdf版

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    Java面试笔试资料大全

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    Java面试宝典2010版

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11、"=="和equals方法究竟有什么区别? 12、静态变量和实例变量的区别? 13、是否可以从一个static方法内部发出对非static方法的调用...

    Java面试宝典2012版

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static...

    Java面试宝典2012新版

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    Java面试宝典-经典

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    JAVA面试宝典2010

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    java面试题大全(2012版)

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、静态变量和实例变量的区别? 12 13、是否可以从一个static方法内部发出对非static方法...

    java面试宝典2012

    10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 12 12、静态变量和实例变量的区别? 13 13、是否可以从一个static方法内部发出对非static方法...

Global site tag (gtag.js) - Google Analytics