对于Java类加载过程中的顺序问题探究

发表于:2012-2-15 09:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:a352193394    来源:51Testing软件测试网采编

  以前记得static代码块貌似是Java类加载过程中优先级最高的,但是最近几天写代码发现不是这样的,因为static变量的优先级要比static代码块高得多,所以因此我犯了不少错误,下面以一个例子来说明一下一个类初始化为对象的时候的加载过程:

  1. package com.bird.jdbc;  
  2. public class Test {  
  3.       
  4.       
  5.     private static A a = new A();  
  6.     private final static F f= new F();  
  7.     private B b = new B();  
  8.       
  9.     static{  
  10.         System.out.println("c");  
  11.     }  
  12.       
  13.     public Test(){  
  14.         System.out.println("Test");  
  15.     }  
  16.       
  17.     public static void main(String[] args){  
  18. //      Test t = new Test(); 
  19.         try {  
  20.             Class.forName("com.bird.jdbc.Test");  
  21.         } catch (ClassNotFoundException e) {  
  22.             // TODO Auto-generated catch block 
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26. }  
  27. class A{  
  28.     public A(){  
  29.         System.out.println("A");  
  30.     }  
  31. }  
  32. class B{  
  33.     public B(){  
  34.         System.out.println("B");  
  35.     }  
  36. }  
  37. class F{  
  38.     public F(){  
  39.         System.out.println("F");  
  40.     }  
  41. }

  大家可以看到,直接运行Test t = new test();这句话,运行结果为

  1. A  
  2. F  
  3. c  
  4. B  
  5. Test

  所以是先static变量,然后是static的代码块,然后才是普通变量,最后是构造函数

  如果是运行Class.forName()函数的话,运行结果为

  1. A  
  2. F  
  3. c

  还是这样,先是static变量,然后才是static代码块,所以那种对于class.Forname加载类,只调用static代码块的误区要克服,因为还有一个static代码块在等着你,呵呵,我得记录下来以示警戒。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号