在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

jvm之类加载器(1)

2017-2-23 13:22| 发布者: zhangjf| 查看: 1006| 评论: 0

摘要: 来自: http://www.cnblogs.com/think-in-java/p/5178383.html 首先我们先看一个示例程序: package com.tfdd.test;/** * @desc 类加载校验 * @author chenqm * @date 2016年2月2日 */class Singleton{ pri ...

来自: http://www.cnblogs.com/think-in-java/p/5178383.html

首先我们先看一个示例程序:
  1. package com.tfdd.test;
  2. /**
  3. * @desc 类加载校验
  4. * @author chenqm
  5. * @date 2016年2月2日
  6. */
  7. class Singleton{
  8. private static Singleton singleton = new Singleton();
  9. public static int count1 ;
  10. public static int count2 = 0;
  11. private Singleton(){
  12. count1++;
  13. count2++;
  14. }
  15. public static Singleton getInstance(){
  16. return singleton;
  17. }
  18. }
  19. public class SingletonTest {
  20. public static void main(String[] args) {
  21. Singleton singleton = Singleton.getInstance();
  22. System.out.println(singleton.count1);
  23. System.out.println(singleton.count2);
  24. }
  25. }
复制代码
猜猜输出的结果是什么?据说80%的java程序猿都会犯的错误!

10

就是这样一个结果,我们先不说为什么。接着讲我们的类加载器.

类的加载大致分为三个部分:加载,连接,初始化。

加载 :查找并加载类的二进制数据

连接 :1.验证(确保被加载类的准确性) 2.准备(为类的静态变量分配内存,并将其初始化为默认值) 3.解析(将类中的符号引用转化为直接引用)

初始化 :为类的静态变量赋予正确的初始值(即赋上我们给出的值)

然后我们再看看java程序对类的使用方式:主动使用和被动使用。请注意下面我说的这句话

所有的JAVA虚拟机实现必须在每个类或接口被JAVA程序“首次主动使用”时才初始化他们。

那么什么叫主动使用?基本上分为6种情况:

--创建类的实例

--访问某个类或接口的静态变量,或者对该静态变量赋值

--调用类的静态方法

--反射

--初始化一个类的子类

--java虚拟机启动时被标明为启动类的类

了解了这些知识之后,我现在来回答之前的问题,

  1. <strong>Singleton.getInstance(); 调用了类的静态方法,符合首次主动使用该类的情况!那么我们进入初始化阶段。
  2. 初始化已经属于类加载的第三步了,在第二步的连接的准备部分,已经赋过一次默认值了。所以应该是这样一个过程:
  3. 1.singleton = null;count1=0;count1=0</strong> <strong>2.singleton = new Singleton(); 此时执行构造函数,结果为count0=1;count1=1</strong> <strong>3.count0没有被我们赋值跳过初始化,count1赋值为0所以结果为count0=1;count1=0</strong> <strong>(*注意) 类的静态变量赋值的顺序是按照代码的书写的顺序执行的。
  4. 修改代码如下:</strong>
复制代码
  1. package com.tfdd.test;
  2. /**
  3. * @desc 类加载校验
  4. * @author chenqm
  5. * @date 2016年2月2日
  6. */
  7. class Singleton{
  8. public static int count1 ;
  9. public static int count2 = 0;
  10. private static Singleton singleton = new Singleton();
  11. private Singleton(){
  12. count1++;
  13. count2++;
  14. }
  15. public static Singleton getInstance(){
  16. return singleton;
  17. }
  18. }
  19. public class SingletonTest {
  20. public static void main(String[] args) {
  21. Singleton singleton = Singleton.getInstance();
  22. System.out.println(singleton.count1);
  23. System.out.println(singleton.count2);
  24. }
  25. }
复制代码

输出结果为

1

1

证明赋值的顺序是根据代码书写的先后顺序执行的!

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-11 19:52

Copyright 2015-2025 djqfx

返回顶部