运行时类型识别(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对象。

RTTI 运行时类型识别 及异常处理

RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...

框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

MFC原理第三讲.RTTI运行时类型识别

MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

RTTI(运行时类型识别)

C++为了能够在运行时正确判断一个对象确切的类型,加入了RTTI和type_info. type_info 为每一个类型增加一个type_info对象. 为了能够在运行时获得对象的类型信息type_i ...

RTTI(运行时类型识别),typeid,dynamic_cast

dynamic_cast注意: 1.只能应用于指针和引用的转换: 2.要转换的类型中必须包含虚函数: 3.转换成功则返回地址,如果失败则返回NULL: 参见项目:RTTI

RTTI (Run-Time Type Identification,通过运行时类型识别) 转

参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

MFC六大核心机制之二:运行时类型识别(RTTI)

上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

RTTI(运行时类型识别)

运行时类型识别(Run-time type identification , RTTI),是指在只有一个指向基类的指针或引用时,确定所指对象的准确类型的操作.其常被说成是C++的四大扩展之一(其他三个 ...

C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理

运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...

随机推荐

iOS 开发笔记 -- 各种细枝末节的知识(水滴石穿)

在此总结整理,遇到的各种的小问题: 1.通过从字典(数组)中取出的NSString的length==0 作为if的判断条件导致的carsh: 由于在字典中通过Key取出值之后直接做了length相关操 ...

我和Java的故事-------第1弹

前言:兴趣是学习任何新知识最好的老师 --------------------------------------------------------------------------------- ...

【Hadoop需要的Jar包】Hadoop编程-pom.xml文件

JDK版本的要求 Hadoop 2.7 以及之后的版本,需要JDK 7: Hadoop 2.6 以及之前的版本,支持JDK 6: 对于Hadoop1.x.x版本,只需要引入1个jar: hadoop- ...

vim使用指北 ---- Advanced Editing

本节介绍vi和ex的一些高级功能. 配置vi 配置文件.exrc可以保存在你的主目录下,在vi启动的时候执行这个配置文件.但在当前工作目录下可以放置一个配置文件,对当前目录做一个自定义配置. :set ...

Swift —构造函数与存储属性初始化-备

构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和height后,那么在定义他们时就不需要初始化了. ...

Javascript之Dom学习

1.简介:DOM是一套对文档的内容进行抽象和概念化的方法.在现实世界里,人们对"世界对象模型"一定不会陌生,当人们用"房子","汽车"等这一 ...

OFFICE 您正试图运行的函数包含有宏或需要宏语言支持的内容。

故障现象:打开WORD的时候,提示“您正试图运行的函数包含有宏或需要宏语言支持的内容.而在安装此软件时,您(或您的管理员)选择了不安装宏或控件的支持功能”. 提示现象: 解决办法 : 1.进入“控制面 ...

Codeforces 101572 D - Distinctive Character

D - Distinctive Character 思路:bfs 使最大的匹配数最小,转换一下,就是使最小的不匹配数最大,用bfs找最大的距离 代码: #pragma GCC optimize(2) ...

python3学习笔记一(标识符、关键字)

查看Python版本 可以命令窗口,windows使用win+R调出cmd运行框,输入以下命令: python -V 进入python的交互编辑模式,也可查看 D:\Python3.6\Scripts ...

sql server 2008 数据库可疑的解决步骤

备份并新建同名数据库,并替换原数据文件 1 把问题数据库备份后直接删除 停掉SQLSERVER服务,把服务器上出问题的数据库, 假设名称为 test的数据库文件及日志文件备份到其他目录,然后直接将其删 ...

java 运行时类型_Java基础之RTTI 运行时类型识别相关推荐

  1. java的继承属于哪种类型_Java基础 继承

    二.继承 什么是继承关系:基于某个父类对对象的定义加以拓展,而产生新的子类的定,子类可以继承父类的某些属性,也可以增加原来父类所没有的定义,或者覆写父类中的某些特性. 从面向对象的角度分析,继承是一种 ...

  2. 三年Java开发,你连基础的JVM运行时内存布局都忘了

    面:为什么要使用双亲委派机制去加载类? 答:避免多份同样字节码的加载,浪费内存. 类的加载方式 隐式加载:new 显示加载:loadClass.forName等 类的装载过程如下图: 面:loadCl ...

  3. java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

    1.1 方法重载的概述和特点 方法重载概述 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可. 方法重载特点 与返回值类型无关,只看方法名和参数列表 在调用时,虚拟机通 ...

  4. JAva入门 活着_java基础回顾

    最近在回顾java基础知识,收货颇多,在此做个总结 1.List和Set的区别 ---List -----可以允许重复的对象 -----可以插入null元素 -----是一个有序容器,保持着每个元素的 ...

  5. java io流 教程_Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...

  6. java package报错_Java基础知识总结 - 超详细篇(上)

    1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java程序的运行环境,ja ...

  7. java 数字运算异常_Java基础之:异常及异常处理

    Java基础之:异常及异常处理 我们将java程序执行过程中出现的不正常现象称为异常,例如:之前遇到的数组下标越界异常,空指针异常等等 执行过程中发生的异常事件分为两类: Error(错误):Java ...

  8. java继承和多态_Java基础继承与多态

    Java基础第九天 继承概述 引入 首先我来写两个代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15//定义学生类 class Student { public void  ...

  9. java 全局变量 命名规则_Java 基础 运算符 命名规则 变量 循环

    1.程序: 一组指示计算机执行行动或坐车判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上. 2.软件 与计算机操作系统有关的计算机程序,规程.规则,以及可能有的文件,文档及数据 3.软 ...

最新文章

  1. 基于场景建模的自动化配置
  2. 高性能计算机系统及应用,高性能计算
  3. Git 系列(二):初步了解 Git
  4. docker mysql 防火墙_docker mysql
  5. 使用OClint进行iOS项目的静态代码扫描
  6. 深入理解HTTP协议—HTTP协议详解(真的很经典)
  7. python编程读取文件内容_python编程从入门到实践:读取整个文件和创建包含文件各行的内容...
  8. GIS应用技巧之制作土地利用转移矩阵表
  9. 【银行】2015农行软开 笔试+面试 小记
  10. 英语四级和计算机一级算多少学分,英语四级几分过 英语四级426分过了吗。
  11. 教你如何用ps美化皮肤 每一步都很容易理解!
  12. Canal源码分析deployer模块
  13. 与微信公众平台的商榷
  14. xposed检测方法
  15. Catia V5-6R2016软件安装教程——附下载地址
  16. Gentoo 完整的USE参数清单中文详解(转)
  17. h200和gr1108_华三H3C GR1108-P 路由器性能极限
  18. Error: Your CLT does not support macOS 11.
  19. 日程定时提醒程序C语言,DIY一个高大上带提醒的计时器,简单实用,你还在等什么...
  20. IDEA集成leetcode

热门文章

  1. linux sed举例,sed 常用命令与参数,带举例:时时更新!
  2. Linux测量进程内存峰值,linux / unix进程的峰值内存使用情况
  3. 用python做生物信息数据分析_基于Python的自动获取生物信息数据的软件设计
  4. 深度学习之基于LeNet-5实现cifar10的识别
  5. [蓝桥杯][2014年第五届真题]兰顿蚂蚁(模拟)
  6. 273. 整数转换英文表示(模拟)
  7. 1. 两数之和(Java)
  8. 远洋整站下载器不能用https_最后下载个喜马拉雅
  9. 数据库SQL语言从入门到精通--Part 2--MySQL安装
  10. a label can only be part of a statement and a declaration is not a statement