链接地址:http://www.cnblogs.com/vamei/archive/2013/04/14/3013985.html

作者: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.classSystem.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类更多的方法可查询官方文档:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

Class类的加载

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

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

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

欢迎继续阅读“Java快速教程”系列文章

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

Java进阶04 RTTI相关推荐

  1. Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!

    Java小白的历练之路------从0到1 title: Java Essay date: 2022-09-07 08:58:32 tags: Java notes 写在前面: 免责声明:本笔记来源自 ...

  2. Java知识点04——集合(Set、List、Queue、Map、Collection和Iterator、Collections工具类)

    Java知识点04--集合(Set.List.Queue.Map.Collection.Iterator.Collections工具类) 一.集合 1.1 集合概述 二.Collection 2.1 ...

  3. java进阶Kafka集群实战之原理分析及优化教程全在这里

    我不去想是否能够成功 既然选择了Java 便只顾风雨兼程 我不去想能否征服Kafka集群 既然钟情于Java 就勇敢地追随千锋 我不去想Kafka集群有多么晦涩难懂 既然目标是远方 留给世界的只能是努 ...

  4. Java进阶之验证码知识点总结

    java进阶验证码 1.1 验证码的作用 通常情况下,浏览器都是应用HTML标准与网站服务器动态联接的,而在HTML的表单中,基本上都是使用指定Action的POST方法提交数据.这就很容易被一些别有 ...

  5. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

  6. Java 进阶 ——2019 计划要读的书

    Java 进阶 --2019 计划要读的书 代码整洁之道 重构 这两本学习完再写下面的书

  7. 《Java 进阶之路》 下--推荐书籍

    真正想提升自己,我感觉最主要的是先把 JVM.并发.网络这三块知识点学会.学通,这三块是基础,后面所有的框架.中间件等相关的都是基于这三块知识点之上的.学完这三块知识点,可以快速的掌握其它的知识,新框 ...

  8. 《java 进阶之路》 上--推荐书籍

    整整一月没有更新博客了,因为十月份和双十一新入手的6本技术相关的书,这个月看完了3本,后面的3本还得慢慢肯. 下面我就介绍下进阶高级工程师必须也是我自己都看的一些书和知识点. 1.深入理解Java虚拟 ...

  9. Java进阶书籍推荐,赶快收藏起来!

    最近有很多学习或者已经在工作的java技术的同学都想要更进一步的提升自己,那么阅读书籍可以给大家带来帮助.今天,小千将分享过去几年中一些最好的Java进阶书籍,您可以在2021年阅读这些书籍,以更好地 ...

最新文章

  1. 38.linux集合
  2. linux运维实战练习-2015年9月13日-9月15日课程作业(练习)安排
  3. .jsp与servlet之间页面跳转及参数传递实例
  4. C语言中指针的初始化和赋值
  5. Python文件操作-文件的增删改查
  6. CentOS7编译安装ntp
  7. Java异常处理-自定义异常
  8. 20200314:字母异位词分组(leetcode49)
  9. Axure RP9如何实现点击文字图标变色?
  10. JAVA实现EXCEL公式专题(七)——统计函数
  11. kf真空接头标准尺寸_【真空】真空导入工艺详解!附具体操作步骤
  12. 芯片数据分析步骤3 芯片质量控制-affy
  13. 我国计算机通信技术现状及未来的发展趋势,概述计算机通信技术的发展趋势
  14. 自动摘要生成(一):最大边界相关算法(MMR)
  15. [转]我在赶集网的两个月 7.4(完结)
  16. uniapp GPS定位功能的实现
  17. java项目DVD碟片出租系统
  18. 关于天猫抢茅台的Python秒杀脚本!
  19. 【时间序列分析】11.AR(1)和AR(2)模型
  20. Dec-c++ 底部编译信息/报告窗口不显示

热门文章

  1. 0076-小升初1:生日蛋糕
  2. Linux Shell中有三种引号的用法
  3. Spark实战之读写HBase
  4. inline,block,inline-block的区别
  5. [Unity3D]unity3d5.0简单的调用摄像头
  6. 讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题
  7. oracle仲裁磁盘是一块磁盘吗,基于ASM冗余设计的架构,仲裁磁盘组应该如何去规划?...
  8. java设计模式在项目中的使用_SpringMVC项目里,有必要使用一些设计模式吗?
  9. 68-Flutter中极光推送的使用
  10. teleport最新版不支持mysql_QA · tp4a/teleport Wiki · GitHub