Java进阶04 RTTI

链接地址: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springdatajpa命名规则_Spring Boot 之Spring data JPA简介

PA的全称是Java Persistence API (JPA),他是一个存储API的标准,而Spring data JPA就是对JPA的一种实现,可以让我们方便的对数据进行存取。按照约定好的方法命名规则写dao层接口,从而在不实现接口的情况下,实现对数据库…

PHPCMS 模板的设置

编制好模板后&#xff0c; 一、设置config.php<?php return array (name > 现代的蓝红色模板,author > dazhaihui,dirname > simpleblue,homepage > http://www.phpcms.cn/,version > 1.0,disable > 0,file_explan >array (templates|simpleblue|cont…

奖学金设计mysql_基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)

基于JAVA的奖学金评定系统设计与实现(MySQL)(含录像)(任务书,开题报告,外文翻译,毕业论文10000字,程序代码,MySQL数据库,答辩PPT,答辩视频录像)摘 要本文论述了奖学金评定系统从分析到实现的整个过程&#xff0c;说明了系统实现的基本思路&#xff0c;介绍系统不同的功能模块以…

python ckeditor上传图片400错误_又一款python开发神器

优秀的python开发工具有很多&#xff0c;比如pycharm&#xff0c;spder&#xff0c;ipython&#xff0c;jupyter以及很多编辑器的插件等。但是如果利用python来做数据分析的话&#xff0c;要是有一款类似Rstudio的工具就好了&#xff0c;Rstudio是非常人性化的工具。之前有一个…

rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列

延迟队列是为了存放那些延迟执行的消息&#xff0c;待消息过期之后消费端从队列里拿出来执行。DLX TTL 方式存在的时序问题对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的&#xff0c;之前有介绍过如何使用 RabbitMQ 死信队列(DLX) TTL 的方式来模拟实现延迟队列…

JS - 按钮倒计时

效果&#xff1a; html代码&#xff1a; <input type"button" id"btn" value"点击获取效验码" />js代码&#xff1a; //倒计时var wait60;function time(o) {if (wait 0) {o.removeAttribute("disabled"); o.value&qu…

python安装报错类型_Python处理验证码第一篇(pytesser初探及报错处理)

前言&#xff1a;春节期间&#xff0c;无法全身心投入地去写爬虫&#xff0c;那就玩玩验证码吧&#xff0c;应该比较有趣&#xff01;首次接触验证码识别&#xff0c;用pytesser接触一下最简单的验证码先&#xff0c;代码参照&#xff1a;使用python以及工具包进行简单的验证码…

bin文件怎么转换成文本文档_怎么把pdf文件转换成word文档?这样转很简单

在日常的学习、工作生活中&#xff0c;小伙伴们总少不了要对文件格式进行转换操作&#xff0c;例如把pdf文件转换成word文档。对于职场老手来说&#xff0c;这当然不算一个难度操作&#xff0c;甚至还很简单。但对于职场新人而言&#xff0c;找不对方法&#xff0c;可能操作起来…

delphi if多个条件_Python从入门到精通——一文读懂if语句用法

1、if语句概述if语句能够进行条件测试&#xff0c;并依据一定的条件进行具体的操作2、if语句条件测试if语句的核心是一个值为True或False的表达式&#xff0c;这种表达式称为条件测试。Python根据条件测试的值为True或False来决定是否执行if语句中的代码。2.1 条件测试是否相等…

jquery交换数组元素位置_跟我一起学jQuery——第一集

《锋利的JQuery》第二版阅读笔记-第一章jQuery对象和DOM对象想学习jQuery&#xff0c;首先要学会区分jQuery对象和DOM对象。1)jQuery对象是用jQuery类库的选择器获得的对象。2)DOM对象是用传统(javascript)获得的对象。举个栗子//DOM对象var domO document.getElementById(&qu…

Gitlab的develop角色的人没有权限无法提交的问题解决方案

问题 事情是这样的&#xff0c;最近跟几位同事搞一些东西&#xff0c;打算在Gitlab上建一个仓库&#xff0c;然后协同开发。 我建好仓库&#xff0c;将其他几位同事添加进来&#xff0c;角色分配为Develop。 之后提交初始代码到master分支后&#xff0c;他们用sourceTree拉取代…

macbook不能进系统 备份数据_不基于备份和表,生产系统数据误删就能完全恢复?!...

作者介绍刘宝珍&#xff0c;架构师&#xff0c;目前就职于大型资产管理公司的科技子公司&#xff0c;拥有多年的大型私有云的规划和设计工作经验&#xff0c;熟悉软件的开发流程&#xff0c;目前醉心于研究基于DDD和敏捷的软件的开发模式&#xff0c;对分布式架构有深入的理解&…

arduino代码_arduino智能小车项目——01、配件介绍及代码部分教程

各位小伙伴大家好&#xff1a;本期我们开始制作智能小车项目&#xff0c;这因该是资源包里面难度相对较大的项目。所以我们从易到难把项目进行分解&#xff0c;先从实现较为简单的功能开始。本期我们的目标是实现小车的自主运动&#xff0c;代码部分也相对比较简单&#xff0c;…

python+mysql库+json_用python写爬虫-5.1json用pandas入mysql库

pandas是一个数据处理模块&#xff0c;前面也已经提到了好些&#xff0c;用python写爬虫--4.5pandas存入excel.这次来统一说一说&#xff0c;使用感想。pandas主要是Seriers和Dataframe&#xff0c;Seriers相当于list&#xff0c;dataframe相当于excel表格&#xff0c;有行也有…

pdf温度记录仪开发_蔬菜、鲜果、奶制品冷链温度监控系统监控食品让客户放心...

冷链温度监控系统对于蔬菜鲜果奶制品的冷藏&#xff0c;不仅有助于减慢它们的腐坏速度&#xff0c;保持新鲜&#xff0c;而且对全国物品的运输和合理配置有极大的影响。选择GPS冷链温度监控食品传输过程让客户不再担心质量问题&#xff0c;人们也吃的放心。在多年自主开发GPS物…

python中什么是数据驱动_Python数据驱动DDT的应用

原标题&#xff1a;Python数据驱动DDT的应用 在开始之前&#xff0c;我们先来明确一下什么是数据驱动&#xff0c;在百度百科中数据驱动的解释是&#xff1a;数据驱动测试&#xff0c;即黑盒测试&#xff08;Black-box Testing&#xff09;&#xff0c;又称为功能测试&#xff…

2008日志清理 server sql_SQL Server 2008 收缩日志 清空删除大日志文件

由于SQL2008对文件和日志管理进行了优化&#xff0c;所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消&#xff1a;(SQL2005)BackupLog DNName with no_loggodumptransaction DNName with no_loggoUSE DNNameDBCC SHRINKFILE (2)Go-----------------------------------…

go java性能_服务端I/O性能大比拼:Node、PHP、Java和Go

理解应用程序的输入/输出(I/O)模型&#xff0c;意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小&#xff0c;也没有服务于很高的负载&#xff0c;也许它影响甚微。但随着应用程序的负载逐渐上涨&#xff0c;采用错误的I/O模型有可能会让你到处踩坑&am…

python数据库安装_python数据库-MySQL安装问题总结(48)

一、ERROR 1698(28000):Access denied for user rootlocalhost错误 我的操作系统是ubuntu&#xff1a;我的MySQL版本是&#xff1a;安装完成后&#xff0c;登录mysql的时候就出现了如下错误&#xff1a;因为安装的过程中没让设置密码&#xff0c;可能密码为空&#xff0c;但无论…

[转]什么是RSS

http://www.blogbus.com/bangzhuzhongxin-logs/5452786.html 如果您够仔细的话&#xff0c;一定会发现BlogBus的每一个Blog站上都会有一个 图标。这个图标表示Blogbus支持RSS功能&#xff08;目前是RSS 2.0&#xff09;&#xff0c;即所谓的新闻聚合功能。 点击 图标&#xf…