[面向对象]类与对象与Java里的Class类

一上来并不想先去想什么是类,什么是对象。而是想思考一些问题:为何java里面可以有Class这个类?这个Class类对应的实例对象到底是一个什么样的对象,他和类的关系是什么,和对象的关系是什么?Class类也继承自Object类吗?这样是否会有点奇怪。

1.类与对象定义

要回答这个问题首先还是要明确类与对象分别的定义是什么。在面向对象的概念当中,

类:是指的具有相同属性性质的一类事物的一个抽象。例如:车,人,马,桌子,灯泡,马路.....非常多,可以把世界上所以的东西都囊括

对象:对象是某一个特定的类的一个实例.在java里面他是关键字new创建的一个实例,或是spring注入的一个实例(本质依然是new),关键字new对应的是虚拟机里的一个专门创建对象的指令。例如:我家的金色迈腾,周杰伦,这匹白色的马,木头桌子,这间屋子里的白炽灯泡,这条柏油马路。

用表格对比如下:

该类的一个对象
我家的金色迈腾
周杰伦
这匹白色的马
桌子 这张木头桌子
灯泡 这间屋子里的白炽灯泡(数组对象,本质上仍然是该类的一个对象,但是它的类型为数组,程序里面为了便于描述与批量操作,使用了容器这样的概念来帮助我们。本质上仍然是来源于生活,比如一箱白炽灯泡,我要对他们都贴上标签。这里的箱子就是容器,是现实生活中的容器,而这个批量的操作就恰似我们的业务逻辑,这里就是贴标签)
马路 这条柏油马路

特地对数组对象,批量对象做了说明.

2.Java中的Class类到底是什么?

Java里面最出名得类可能是Object,众所周知,java里所有的类都继承自Object类,java体系里最顶上的类只有Object一个类。这是与C++不一样的地方之一.关于Object类的介绍请参见我的另一篇博客: . 这里现在可以回答的问题是Class类肯定也是继承自Object类的。

并且在Object里面还提供了一个native方法getClass()用于返回调用这个方法的对象的运行时的class。英文原文注释如下:

Returns the runtime class of this {@code Object}

那么,为什么需要Class类。在java中用来表示运行时类型信息的对应类就是Class类。从java的关键字new,即虚拟机的new指令说起。当虚拟机执行了new这个指令之后,(注意,不仅关键字new会似的虚拟机执行new指令,调用静态方法也会,jvm里面规定了五种情况必须初始化一个对象。),Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。实际上在Java中每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里(编译后的字节码文件保存的就是Class对象)。需要特别注意的是,手动编写的每个class类,无论创建多少个实例对象,在JVM中都只有一个Class对象,即在内存中每个类有且只有一个相对应的Class对象。

这里可以引申一下,为什么synchronized关键字在锁定的是Class的时候会对所有类的实例都生效。这里不言自明。

因此总结一下:

手动编写的类被编译后会产生一个Class对象,其表示的是创建的类的类型信息,而且这个Class对象保存在同名.class的文件中(字节码文件).Class类的对象作用是运行时提供或获得某个对象的类型信息,这点对于反射技术很重要

3.三种获得Class对象的方式

  • 通过继承自Object类的getClass方法,
  • Class类的静态方法forName
  • 字面常量的方式”.class”。

其中实例类的getClass方法和Class类的静态方法forName都将会触发类的初始化阶段,而字面常量获取Class对象的方式则不会触发初始化。

初始化是类加载的最后一个阶段,也就是说完成这个阶段后类也就加载到内存中(Class对象在加载阶段已被创建),此时可以对类进行各种必要的操作了(如new对象,调用静态成员等),注意在这个阶段,才真正开始执行类中定义的Java程序代码或者字节码。

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。一直以来反射技术都是Java中的闪亮点,这也是目前大部分框架(如Spring/Mybatis等)得以实现的支柱。在Java中,Class类与java.lang.reflect类库一起对反射技术进行了全力的支持。

关于这一部分的内容请移步至:https://blog.csdn.net/javazejian/article/details/70768369

猜你喜欢

转载自blog.csdn.net/topdeveloperr/article/details/81066872