现在的位置: 首页 > 综合 > 正文

.Class, Class.forName, .getClass()的区别

2018年04月21日 ⁄ 综合 ⁄ 共 1183字 ⁄ 字号 评论关闭

本来是在学习反射机制的, 可是看到其中有用到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的执行过程不太清楚, 改天有空再补补这方面的知识





抱歉!评论已关闭.