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

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





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值