概述
从什么是类开始说起…
我们都知道类也是由成员变量`构造器和方法等构成的
所以其本质也是一个一个的对象 需要通过对象来描述和创建
这里的对象是什么呢? 是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的时候有没有注意到一个总会出现但又极不起眼的地方:
这是什么?
Class我知道了是Class类 后面加@数字是什么意思?
其实不只是Class
任何类(在其作用域范围内)为了表示一个唯一
的对象都需要加一个数字 也就是该对象的HashCode
再深入一点
通过show objects可以看到程序里(或断点之前)加载到的所有类对象都在这里
(我怀疑数字的大小也反映了类的加载顺序 没有深入了解过 有研究过的同学请告知我)
每个类对象又都是生产其对应类的对象的模板
就连类的加载和对象的建立都是发散性的
就像宇宙大爆炸 从一个奇点之所以可以辐射出万事万物
是因为这个奇点本身就是所有事物的抽象
反过来想 从一个学生 到一类学生 到一类人 到一种生物 到一种"东西"
每次联想都是一次寻找共性的过程
探究真理本身就是不断探究共性
我觉得这也是面向对象思想这座金字塔的精髓所在(跑偏了)
最后经过以上的分析 我们不难推测出JVM创建对象的过程:
在需要创建对象时 JVM会检查该类是否已被加载
如果没有 JVM就会通过类加载器(ClassLoader)根据类的名称去找对应的.class文件(这也是Java程序运行前需要先编译的原因 除了加载.class ClassLoader同样负责加载文件和配置等其他资源)
这时如果没有发生错误 此类的类对象(Class对象)会被加载到内存 就像市长得到了他的专属印章(类模板)
然后市长(JVM)就可以在你(程序员)的授意下啪啪啪地在各种文件上盖上"同意"(创建类的对象) 愉快地造各种各样(对象多样性)的违规建筑(bug)了
最后的总结:
.java – 编译 --> .class – 类加载器 --> Class类对象class --> 实例化 --> 实例对象
普通类是对普通对象的抽象;
类对象是对普通类的抽象;
类对象是JVM的造人工具;
反射就是造人.avi的重放.
聪明的你明白了吗?[/doge]
最后
以上就是精明口红为你收集整理的Class和class? 类对象和类的对象? 一篇文章让你摸到头脑的全部内容,希望文章能够帮你解决Class和class? 类对象和类的对象? 一篇文章让你摸到头脑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复