从什么是类开始说起…

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

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

这里的对象是什么呢? 是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? 类对象和类的对象? 一篇文章让你摸到头脑相关推荐

  1. 我的第一个ASP类(显示止一篇下一篇文章)

    面向对象是现今编程语言的潮流,不过,ASP对面向对象的支持可是寒碜地很.现在感觉ASP的类也不过是一堆函数而已. 不过,在学校时没有学过面向对象的语言,我对面向对象的认识仍然是从ASP开始的. 记下我 ...

  2. javascript 本地对象和内置对象_JavaScript 的面向对象

    图片来源于 DigitalOcean 1. 什么是类 在说 JavaScript 的面向对象的实现方法之前,我们先来看面向对象编程的一个核心概念--类(class).类是对拥有同样属性(propert ...

  3. 客快物流大数据项目(五十六): 编写SparkSession对象工具类

    编写SparkSession对象工具类 后续业务开发过程中,每个子业务(kudu.es.clickhouse等等)都会创建SparkSession对象,以及初始化开发环境,因此将环境初始化操作封装成工 ...

  4. Java 对象和类 的理解

    学而时习之,温故而知新. 对象: 对象是类的一个实例,有状态和行为 类: 类为对象定义属性和行为 识别对象和类, 自己的的知识里面 一般 new 之后的是对象, class后面的是类 对象的特征: 1 ...

  5. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  6. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  7. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

  8. java 类定义_JAVA类与对象(二)----类定义基础

    类是组成java程序的基本要素,是java中的一种重要的复合数据类型.它封装了一类对象的状态和方法,是这一类对象的原型.一个类的实现包括两个部分:类声明和类体,基本格式: class { 属性 方法 ...

  9. 代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析

    1.以类取代类型码 适用情况:类之中有一个数值类型码,但它并不影响类的行为. 重构手段:以一个新的类替换该数值类型码. 重构类图示意: 这里的"不影响类的行为"是什么意思呢? 类型 ...

  10. Java 常用对象-Date类和Calender类

    2017-11-02 22:29:34 Date类:类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值 ...

最新文章

  1. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧
  2. cufflinks基于QuantFig绘制高级金融图
  3. 安徽理工大学计算机技术研究生,安徽理工大学(专业学位)计算机技术研究生辅导...
  4. 霸榜18年,作者连续20年获得微软MVP,这本SQL书凭什么成为畅销经典
  5. Servlet 实例
  6. 使用 JIRA 4.0 + Greenhopper 4.0 进行项目状态跟踪(转)
  7. SVM入门(八)松弛变量
  8. arcgis oracle trace,ArcGIS应用Oracle Spatial特征分析
  9. 图像滤波与滤波器基础知识
  10. csv去重 python_python去重函数是什么
  11. 为何python不好找工作-为什么python不好找工作
  12. mysql sam和db_Mysql
  13. 自建服务器解网络锁,跟断刀学越狱】10分钟掌握iPhone1-4代刷机技巧
  14. 人工智能培训机构-光环国际,开课吧,贪心学院,交大,黑马,七月在线,咕泡,百战程序员哪个靠谱?
  15. 趣学python编程教孩子学编程_趣学Python——教孩子学编程
  16. 视频无损压缩转码免费软件 HandBrake【无损视频画质压缩】
  17. 神州信息“六合上甲”金融实践,助力金融机构打造数据底座
  18. Java中23种设计模式(随时不定时更新)
  19. WPF 用户控件和 WPF自定义控件区别
  20. 绍兴市第十六届计算机复赛试题,绍兴市第十七届少儿信息学竞赛复赛试题

热门文章

  1. MySQL之mysqldump备份数据库
  2. win7安装JDK并配置
  3. Unity Sprite 灰色图
  4. sql语句备份还原数据库
  5. BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
  6. sublime中安装css 格式化插件
  7. python数据分析师面试题选
  8. 摄影构图的几种基本方法
  9. 图片文字识别—OCR技术
  10. 旋转矩阵(维基百科)