Class和class? 类对象和类的对象? 一篇文章让你摸到头脑

从什么是类开始说起…

我们都知道类也是由成员变量`构造器和方法等构成的

所以其本质也是一个一个的对象 需要通过对象来描述和创建

这里的对象是什么呢? 是Class类的对象class<?>

因为class<?>描述的是类的结构 所以一个特定的class<?>对应一个普通类的所有对象(这里有点绕)

Class类对象无法直接创建 因为它的构造方法是私有的 是由JVM随类装载时自动创建

经常说的
class<?> clazz = Class.forName("com.test.model.Student");

就是一个根据完整类名加载类对象(有别于"类的对象"!)的过程

而平时更多接触的

Student stu = new Student();

就是根据上面的clazz为模板创建的 等同于

Student stu = clazz.newInstance();

class<?>表示接收的类对象可以是任意类型的
与之相对应的比如class<String>就只能接收String的类对象 以此类推

说到这里 似乎一切都开始变得清晰了 但还有一个重要的问题:

clazz存放在哪里\?

不知道你在debug你的bug的时候有没有注意到一个总会出现但又极不起眼的地方:
IDEA中的普通程序

这是什么?

Class我知道了是Class类 后面加@数字是什么意思?

其实不只是Class
任何类(在其作用域范围内)为了表示一个唯一的对象都需要加一个数字 也就是该对象的HashCode

再深入一点
show objects
通过show objects可以看到程序里(或断点之前)加载到的所有类对象都在这里
(我怀疑数字的大小也反映了类的加载顺序 没有深入了解过 有研究过的同学请告知我)

每个类对象又都是生产其对应类的对象的模板

就连类的加载和对象的建立都是发散性的

就像宇宙大爆炸 从一个奇点之所以可以辐射出万事万物

是因为这个奇点本身就是所有事物的抽象

反过来想 从一个学生 到一类学生 到一类人 到一种生物 到一种"东西"

每次联想都是一次寻找共性的过程

探究真理本身就是不断探究共性

我觉得这也是面向对象思想这座金字塔的精髓所在(跑偏了)


最后经过以上的分析 我们不难推测出JVM创建对象的过程:

在需要创建对象时 JVM会检查该类是否已被加载

如果没有 JVM就会通过类加载器(ClassLoader)根据类的名称去找对应的.class文件(这也是Java程序运行前需要先编译的原因 除了加载.class ClassLoader同样负责加载文件和配置等其他资源)

这时如果没有发生错误 此类的类对象(Class对象)会被加载到内存 就像市长得到了他的专属印章(类模板)

然后市长(JVM)就可以在你(程序员)的授意下啪啪啪地在各种文件上盖上"同意"(创建类的对象) 愉快地造各种各样(对象多样性)的违规建筑(bug)了

最后的总结:

.java – 编译 --> .class – 类加载器 --> Class类对象class --> 实例化 --> 实例对象

普通类是对普通对象的抽象;
类对象是对普通类的抽象;
类对象是JVM的造人工具;
反射就是造人.avi的重放.
聪明的你明白了吗?[/doge]

  • 44
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值