class TestOne{ static{ System.out.println("静态代码块运行"); } TestOne(){ System.out.println("构造方法"); } }
首先这是一个类,如上代码。
对于这个类,有一个静态代码块,有一个构造方法。
看这段代码:
Testone to = new Testone();
输出结果是什么?肯定是:
静态代码块运行构造方法
静态代码块在JVM加载类的时候就会被调入内存,构造方法在创建对象的时候也会被调入内存调用。因此输出结果如上,毫无疑问。
但是,请看下面的代码:
Class cla = Class.forName("Testone");Testont to = cla.newInstance();
如果中间有代码隔开,在输出中我们轻而易举地发现:
当第一句代码执行后,输出
静态代码块执行
当第二句代码执行后,输出:
构造方法
那么,这是为什么呢?
在进行Class.forName("com.TestOne")的时候,实际上是对com.TestOne进行类加载,这时候,会把静态属性、方法以及静态代码块都加载到内存中。所以这时候会打印出"静态代码块运行"。但这时候,对象却还没有产生。所以"构造方法"这几个字不会打印。当执行cla.newInstance()的时候,就是利用反射机制将Class对象生成一个该类的一个实例。这时候对象就产生了。所以打印"构造方法"。当执行到TestOne two=new TestOne()语句时,又生成了一个对象。但这时候类已经加载完毕,静态的东西已经加载到内存中,而静态代码块只执行一次,所以不用再去加载类,所以只会打印"构造方法",而"静态代码块运行"不会打印。【注意:生成多个对象时,静态代码块只被执行一次】