欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

学习Java中Class类及其用法

程序员文章站 2024-03-04 23:42:06
java程序在运行时,java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的rtti。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法...

java程序在运行时,java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的rtti。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是class类。class类封装一个对象和接口运行时的状态,当装载类时,class类型的对象自动创建。

简单总结如下:

class类也是类的一种,只是名字和class关键字高度相似。java是大小写敏感的语言。
class类的对象内容是你创建的类的类型信息,比如你创建一个shapes类,那么,java会生成一个内容是shapes的class类的对象
class类的对象不能像普通类一样,以 new shapes() 的方式创建,它的对象只能由jvm创建,因为这个类没有public构造函数
class类的作用是运行时提供或获得某个对象的类型信息,和c++中的typeid()函数类似。这些信息也可用于反射。

1.class类原理

我们都知道所有的java类都是继承了object这个类,在object这个类中有一个方法:getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是class类的对象。我们自己无法生成一个class对象(构造函数为private),而 这个class类的对象是在当各类被调入时,由 java 虚拟机自动创建 class 对象,或通过类装载器中的 defineclass 方法生成。我们生成的对象都会有个字段记录该对象所属类在class类的对象的所在位置。如下图所示:

学习Java中Class类及其用法

2.获得一个class类对象

第一种办法,class类的forname函数

[codec class shapes{} 
class obj= class.forname("shapes");[/code]

第二种办法,使用对象的getclass()函数

复制代码 代码如下:
class shapes{}
shapes s1=new shapes();
class obj=s1.getclass();
class obj1=s1.getsuperclass();//这个函数作用是获取shapes类的父类的类型

第三种办法,使用类字面常量

复制代码 代码如下:
obj=string.class;
class obj1=int.class;

注意,使用这种办法生成class类对象时,不会使jvm自动加载该类(如string类)。而其他办法会使得jvm初始化该类。

3.使用class类的对象来生成目标类的实例

生成不精确的object实例

获取一个class类的对象后,可以用 newinstance() 函数来生成目标类的一个实例。然而,该函数并不能直接生成目标类的实例,只能生成object类的实例

复制代码 代码如下:
obj=class.forname("shapes");
object shapesinstance=obj.newinstance();

使用泛化class引用生成带类型的目标实例

复制代码 代码如下:
shapes> obj=shapes.class;
shapes newshape=obj.newinstance();

因为有了类型限制,所以使用泛化class语法的对象引用不能指向别的类。

复制代码 代码如下:
class obj1=int.class;
class<integer> obj2=int.class;
obj1=double.class;
//obj2=double.class; 这一行代码是非法的,obj2不能改指向别的类了

然而,有个灵活的用法,使得你可以用class的对象指向基类的任何子类。

复制代码 代码如下:
class<? extends number> obj=int.class;
obj=number.class;
obj=double.class;

因此,以下语法生成的class对象可以指向任何类。

复制代码 代码如下:
class<?> obj=int.class;
obj=double.class;
obj=shapes.class;

最后一个奇怪的用法是,当你使用这种泛型语法来构建你手头有的一个class类的对象的基类对象时,必须采用以下的特殊语法

复制代码 代码如下:
public class shapes{}
class round extends shapes{}
class<round> rclass=round.class;
class<? super round> sclass= rclass.getsuperclass();
//class<shapes> sclass=rclass.getsuperclass();

我们明知道,round的基类就是shapes,但是却不能直接声明 class < shapes >,必须使用特殊语法

class < ? super round >

以上就是本文的全部内容,希望对大家的学习有所帮助。