引发问题的来源:最近在看比较深入的JVM相关的书,不得不感慨,JVM确实是比较深奥,很多地方难以理解不说,在网上还找不到什么资料,发现一个左思右想都想不明白的问题上网来搜索,结果基本上都是从书上copy下来的东西,还是不能理解。

  问题的出现:今天突然想到一个这样的问题,就是类变量也就是静态变量的初始化问题。以前的范范理解是静态变量在类加载的时候就会初始化,反正是在初始化堆内存的之前会初始化静态变量,知道是这么一回事,但是不知其所以然。因为类加载其实也是有很多个步骤的,比如加载-连接-初始化。以前理解的类加载的意思就有点歧义,究竟是加载-连接叫做类加载还是仅仅是加载-连接这其中的加载呢?我们知道Class.forName("ClassName")与ClassName.class都会返回一个类的Class对象(这个东西不好理解,但是一旦理解了这玩意,对Java的反射机制的理解就又会上升一个高度),但是这两个有什么区别呢?

  带着这两个问题,上网查了一下,然后自己写了测试代码来测试。

  1.定义一个类MyClass:里面有一个内部内,还有一个静态变量和一个静态代码块。

public class MyClass {

    static InnerClass in = new InnerClass();

    static {
System.out.println("static block");
} static class InnerClass {
static {
System.out.println("inner");
}
}
}

  2.测试代码:

@SuppressWarnings("all")
public class MyClassTest {
@Test
public void testMyClass() {
try {
Class c1 = MyClass.class;
// 没有任何输出
Class c2 = Class.forName("chain.MyClass");
// 输出:
// inner
// static block
} catch (Exception e) {
e.printStackTrace();
}
}
}

  根据输出结果可以发现:.class仅仅是把类加载进JVM而没有做类的初始化,而forName的形式是初始化了类的(包括初始化静态变量和静态代码快),他们都进行类加载,唯一区别就是初始化类变量与否,这是第二个问题的答案,第一个问题的答案显而易见,我以前理解的静态变量的加载其实是进行的是forName的结果。

  

Class.forName("ClassName")与ClassName.class的区别的更多相关文章

  1. Class.forName(String className)这个方法的作用

    Class.forName(String className)这个方法的作用 解答:通过类的全名获得该类的类对象

  2. PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/classname

    php利用PHPExcel类导出导入Excel用法 来源:   时间:2013-09-05 19:26:56   阅读数: 分享到: 16 [导读] PHPExcel类是php一个excel表格处理插 ...

  3. js实现addClass方法,classList与className有什么区别?

     壹 ❀ 引 Jquery中addClass与removeClass是两个使用高频的方法,对于为dom元素增删class类非常方便:但如果不用JQ,使用js怎么模拟它们呢?本文主要记录下自己的实现思路 ...

  4. $(document).on('click','.classname',function(){}); VS $('.classname').on('click',function(){});

    jquery中用on来绑定事件,经常的写法有$(document).on('click','.classname',function(){});$('.classname').on('click',f ...

  5. JavaScript之ClassName属性学习

    在前面的style属性学习中,知道了通过style属性可以控制元素的样式,从而实现了行为层通过DOM的style属性去干预变现层显示的目地,但是这种就是不好的,而且为了实现通过DOM脚本设置的样式,你 ...

  6. classname 就是在css上添加类,然后js的类名等于

      <!DOCTYPE HTML>   <html>   <head>   <meta http-equiv="Content-Type" ...

  7. 添加以及删除className

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. JS的className,字体放大缩小

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  9. js改变或添加className

    js改变或添加className <style type="text/css"> .newDiv { font-weight: bold; } </style&g ...

随机推荐

  1. Ubuntu下virtualbox nat网络模式下 实现宿主机访问虚拟机

    参考原文(在windows环境下):http://hi.baidu.com/george_gly/item/5183b76e5a79e49ac5d2498b nat网络模式下,虚拟机可以访问外网.访问 ...

  2. [BS-20] 导航控制器和视图控制器在添加控制器的区别

    导航控制器和视图控制器在添加控制器的区别 1. 因导航控制器拥有导航栈,有一个普通视图控制器都没有的数组viewControllers,加入该数组中的视图控制器默认以push的方式进入导航栈.导航控制 ...

  3. 开机取消显示 系统准备工具(Sysprep)

    问题: 解决办法: 1.关闭系统准备工具 3.14 2.桌面  ---  开始 ---  运行  ----  输入  XCOPY %windir%\System32\svchost.exe %wind ...

  4. WPF 应用程序使用 Multilingual App Toolkit

    应用程序支持多语言,使用 Multilingual App Toolkit是一个不错的解决方案. Multilingual App Toolkit下载地址: https://visualstudiog ...

  5. session的方法

    Hibernate对象的状态 瞬时(Transient) — 由 new 操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的.瞬时(Transien ...

  6. css元素position定位和z-index

    网页元素定位 1.注意点: 1)给元素设定高度要小心,除非给已知大小的图片设置高度,否则无法得知指定元素在页面上会有多高.此时最好通过padding等来控制高度. 2)对于同一个元素,不要讲float ...

  7. iOS - (集成支付宝SDK大坑总结)

    其实集成支付宝相对于集成微信支付来说,支付宝算是简单的了,后续有空再去研究微信支付,现目前先总结一下集成支付宝所遇到的坑,其实支付宝的坑也不算太多,细算下来大概5-6个左右,但是其报错方式有点恶心,不 ...

  8. Using RestTemplate, how to send the request to a proxy first so I can use my junits with JMeter?

    org.springframework.http.client.SimpleClientHttpRequestFactory java.net.Proxy java.net.Proxy.Type ja ...

  9. DG - 开启Active Data Guard

    在配置active data guard之前,phycial standby必须处于以下两个状态之一: (1)standby处于mount状态,并且redo apply正在运行中 (2)standby ...

  10. [转]Entity Framework技术导游系列开篇与热身

    学习Entity Framework技术期间查阅的优秀文章,出于以后方便查阅的缘故,转载至Blog,可查阅原文:http://blog.csdn.net/bitfan/article/details/ ...