学习Java中Class类及其用法
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类的对象的所在位置。如下图所示:
2.获得一个class类对象
第一种办法,class类的forname函数
[codec class shapes{}
class obj= class.forname("shapes");[/code]
第二种办法,使用对象的getclass()函数
shapes s1=new shapes();
class obj=s1.getclass();
class obj1=s1.getsuperclass();//这个函数作用是获取shapes类的父类的类型
第三种办法,使用类字面常量
class obj1=int.class;
注意,使用这种办法生成class类对象时,不会使jvm自动加载该类(如string类)。而其他办法会使得jvm初始化该类。
3.使用class类的对象来生成目标类的实例
生成不精确的object实例
获取一个class类的对象后,可以用 newinstance() 函数来生成目标类的一个实例。然而,该函数并不能直接生成目标类的实例,只能生成object类的实例
object shapesinstance=obj.newinstance();
使用泛化class引用生成带类型的目标实例
shapes newshape=obj.newinstance();
因为有了类型限制,所以使用泛化class语法的对象引用不能指向别的类。
class<integer> obj2=int.class;
obj1=double.class;
//obj2=double.class; 这一行代码是非法的,obj2不能改指向别的类了
然而,有个灵活的用法,使得你可以用class的对象指向基类的任何子类。
obj=number.class;
obj=double.class;
因此,以下语法生成的class对象可以指向任何类。
obj=double.class;
obj=shapes.class;
最后一个奇怪的用法是,当你使用这种泛型语法来构建你手头有的一个class类的对象的基类对象时,必须采用以下的特殊语法
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 >
以上就是本文的全部内容,希望对大家的学习有所帮助。