当前位置: 移动技术网 > IT编程>开发语言>Java > Java语言class类用法及泛化(详解)

Java语言class类用法及泛化(详解)

2019年07月22日  | 移动技术网IT编程  | 我要评论
这篇文章主要介绍了java语言class类用法及泛化(详解),大家都知道java程序在运行过程中,对所有的对象进行类型标识,也就是rtti。这项信息记录了每个对象所属的类。

这篇文章主要介绍了java语言class类用法及泛化(详解),大家都知道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函数

复制代码 代码如下:

public class shapes{} 
class obj= class.forname("shapes");

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

复制代码 代码如下:

public class shapes{}
shapes s1=new shapes();
class obj=s1.getclass();
class obj1=s1.getsuperclass();//这个函数作用是获取shapes类的父类的类型

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

复制代码 代码如下:

class obj=string.class;
class obj1=int.class;

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

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

生成不精确的object实例

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

复制代码 代码如下:

class obj=class.forname("shapes");
object shapesinstance=obj.newinstance();

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

复制代码 代码如下:

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 >

以上内容介绍就是针对java语言class类用法及泛化(详解)全部内容,希望大家喜欢以上内容介绍。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网