类与对象的概念
在Java的体现当中有一个非常特殊的类,即Class类。我们知道java是一门面向对象的编程语言,java中的类是程序员用来表达一个具体问题的抽象的,那么Class类其实就可以简单理解为表达java中的类的共同特点的一个抽象。在深入这个问题之前不妨先再次明确一下类与对象分别的概念是什么。
在面向对象的概念当中,类:是指的具有相同属性性质的一类事物的一个抽象。例如:车,人,马,桌子,灯泡,马路.....非常多,可以把世界上所以的东西都囊括。
对象:对象是某一个特定的类的一个实例.在java里面他是关键字new创建的一个实例,或是spring注入的一个实例(本质依然是new),关键字new对应的是虚拟机里的一个专门创建对象的指令。例如:我家的金色迈腾,周杰伦,这匹白色的马,木头桌子,这间屋子里的白炽灯泡,这条柏油马路。
用表格对比如下:
类 | 该类的一个对象 |
车 | 我家的金色迈腾 |
人 | 周杰伦 |
马 | 这匹白色的马 |
桌子 | 这张木头桌子 |
灯泡 | 这间屋子里的白炽灯泡(数组对象,本质上仍然是该类的一个对象,但是它的类型为数组,程序里面为了便于描述与批量操作,使用了容器这样的概念来帮助我们。本质上仍然是来源于生活,比如一箱白炽灯泡,我要对他们都贴上标签。这里的箱子就是容器,是现实生活中的容器,而这个批量的操作就恰似我们的业务逻辑,这里就是贴标签) |
马路 | 这条柏油马路 |
特地对数组对象,批量对象做了说明.
Class类
我们在上文已经给了一个说法,即Class类是用来代表java的类的一个类。
那么为何java里面可以有Class这个类?,那么这个Class类对应的实例对象到底是一个什么样的对象,他和类的关系是什么,和对象的关系是什么?Class类也继承自Object类吗?带着这些问题我们继续往下看。
Java里面最出名得类可能是Object,众所周知,java里所有的类都继承自Object类,java体系里最顶上的类只有Object一个类。这是与C++不一样的地方之一.关于Object类的介绍请参见我的另一篇博客: . 这里现在可以回答的问题是Class类肯定也是继承自Object类的。
并且在Object里面还提供了一个native方法getClass()用于返回调用这个方法的对象的运行时的class。英文原文注释如下:
/*
Returns the runtime class of this {@code Object}
*/
public final native Class<?> getClass();
在object里面定义了这个方法,意味着所有的对象都可以调用这个方法来获取自己运行时的类。
那么,为什么需要Class类?事实上Class类在java中是用来表示运行时类型信息的对应对象就是Class类对象。它包含了与类有关的信息。事实上,Class对象就是用来创建类的所有常规对象的。java使用Class对象来执行其RTTI。
每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象,更恰当的说,是保存在一个同名的.class文件中。
为了生成这个类的对象,运行这个程序的JVM讲使用类加载器子系统。
所有的类都是在对其第一次使用时,动态的加载到JVM中的。当程序创建第一个对象类的静态成员引用时,就会加载这个类。因此java程序在它开始运行之前并非完全被加载,其各个部分是在必须是才加载的。这一点与传统语言不同。也很难在C++当中做到。类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器根据类名查找.class文件。
一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
因此,也说明了java的对象的创建原理。
class Candy{
static {
System.out.println("Loading Candy too");
}
class Gum{
static {
System.out.println("Loading Gum");
}
}
class Cookie{
static {
System.out.print