本来是在学习反射机制的, 可是看到其中有用到Class.forName, 自己对这个也不太熟悉, 于是就先补补这方面的知识
.Class和Class.forName是编译时决定, 而.getClass()是运行时决定
.Class: JVM将使用类的类装载器, 将类装入内存(前提是:类还没有装入内存),不对类做类的初始化工作.返回类的Class的对象(转, 不是很懂)
.getClass(): 返回对象运行时的真正对象(有可能存在向上转换)所属的类
Class.forName(): 装入类, 并做类的初始化
首先看个例子理解下
public class TestClass { public static void main(String[] args) throws Exception { Test t = new Test(); System.out.println(Test.class); System.out.println(t.getClass()); System.out.println(Class.forName("com.Test")); } }
上面的例子打印出来的结果是
Class com.Test
三者都是相同的, 当打印
System.out.println(t.getClass() == Class.forName("com.Test")); System.out.println(Test.class == Class.forName("com.Test")); System.out.println(t.getClass() == Test.class);
时, 结果都是true
Test类如下
public class Test { }
然后在Test类中增加如下代码
public class Test { public Test() { System.out.println("构造函数初始化"); } static{ System.out.println("静态初始化"); } { System.out.println("非静态初始化"); } }
这时需要分3种情况
1. System.out.println(Test.class);
打印为空
2. Test t = new Test();
System.out.println(t.getClass());
打印为: 构造函数初始化
静态初始化
非静态初始化
3. System.out.println(Class.forName("com.Test"));
打印为: 静态初始化
第一种情况, 由于只是装入内存, 不对类进行初始化, 所以不会执行构造函数, 静态/非静态代码块
第二种情况, 这种情况下, 会执行静态代码块和非静态代码块, 所以会执行
第三种情况, 这种情况下, 只会对类进行静态初始化
这篇文章就到这里为止了, 经过查阅资料和查看网上的文章, 大概的介绍了下三者的区别, 经过这次学习,
发现对java的执行过程不太清楚, 改天有空再补补这方面的知识