博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java进阶04 RTTI
阅读量:5124 次
发布时间:2019-06-13

本文共 2297 字,大约阅读时间需要 7 分钟。

链接地址:

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。

多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。

 

Class类

Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。

每一个Class类的对象代表一个其他的类。比如下面的程序中,Class类的对象c1代表了Human类,c2代表了Woman类。

public class Test{    public static void main(String[] args)    {        Human aPerson = new Human();        Class c1      = aPerson.getClass();        System.out.println(c1.getName());
 
Human anotherPerson = new Woman();        Class c2      = anotherPerson.getClass();        System.out.println(c2.getName());      }}class Human{        /**     * accessor     */    public int getHeight()    {       return this.height;    }    /**     * mutator     */    public void growHeight(int h)    {        this.height = this.height + h;    }private int height; }class Woman extends Human{    /**     * new method     */    public Human giveBirth()    {        System.out.println("Give birth");        return (new Human());    }}

当我们调用对象的getClass()方法时,就得到对应Class对象的引用。

在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。

Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。

getClass: 我是谁?

 

除了getClass()方法外,我们还有其他方式调用Class类的对象。

public class Test{    public static void main(String[] args)    {        Class c3      = Class.forName("Human");        System.out.println(c1.getName());        Class c4      = Woman.class        System.out.println(c2.getName());      }}

上面显示了两种方式:

  • forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。
  • Woman.class方法是直接调用类的class成员。这将返回相应的Class类对象。

 

Class类的方法

Class对象记录了相应类的信息,比如类的名字,类所在的包等等。我们可以调用相应的方法,比如:

getName()         返回类的名字

getPackage()      返回类所在的包

 

可以利用Class对象的newInstance()方法来创建相应类的对象,比如:

Human newPerson = c1.newInstance();  

newInstance()调用默认的不含参数的构建方法。

 

我们可以获得类定义的成员:

getFields()       返回所有的public数据成员

getMethods()      返回所有的public方法

可以进一步使用Reflection分析类。这里不再深入。

 

Class类更多的方法可查询官方文档:

 

Class类的加载

当Java创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。

如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。

在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。

 

欢迎继续阅读“”系列文章

转载于:https://www.cnblogs.com/wvqusrtg/p/4992526.html

你可能感兴趣的文章
SQL-简单查询
查看>>
各种路径的获取方法
查看>>
Xamarin Essentials教程磁力计Magnetometer
查看>>
SQL Server的WAITFOR DELAY注入
查看>>
第四周总结
查看>>
asp.net读取xml方法
查看>>
原型模式
查看>>
android UI布局
查看>>
机房收费系统之结账
查看>>
Linux学习之基本介绍
查看>>
dropify,不错的图片上传预览插件
查看>>
Spring各jar包的作用(转载)
查看>>
SVG_text.动态创建&换行显示(横)
查看>>
C#生成新浪微博短网址 示例源码
查看>>
JAVA读写文件
查看>>
缓存过期时间的设置
查看>>
Java中带标签的break,continue
查看>>
vtun中setsockopt fcntl等有关套接字设置
查看>>
LPC1768的SPI通讯
查看>>
基础Network Request
查看>>