当前位置: 首页 > news >正文

java的RTTI

转自:http://blog.sina.com.cn/s/blog_48dc88270100g1ys.html

今天读《thinking in java》RTTI的时候被搞得很迷糊,既然 RTTI是运行时类型检查,为什么还要严格和多态区别呢,用书上的原话说就是“Java希望我们始终使用多态机制,只在必须的时候使用RTTI”。那么,RTTI与多态到底有什么区别呢?

 

在多态的运用中,基类定义方法,子类重写或者重载该方法。在实际编程中,往往用基类的引用去代表继承自该类的所有子类,那么该引用调用的方法必须是基类中已经定义的。这样的话,在程序运行的时候,编译器自动发现是基类还是它的继承类,从而调用相应的方法。(我猜想,编译器就是通过RTTI发现类型信息的)。

    这样,使用多态机制的方法调用时,必须我们先知道了基类定义了什么方法,这就要求我们对基类定义的控制权。如果基类是来自一个库或者由别人控制,这时候RTTI就是一种解决之道:可以继承一个新类,然后添加你要的方法。在代码的其他地方,可以检查你自己特定的类型,并调用你自己的方法。

   所以说RTTI可以说和多态没有关系,但是我想在多态的实现机制上,肯定用到了RTTI。

 

PS:

在Java中,RTTI表现在:
1。Class对象,是RTTI的核心,每个类都有一个class对象。每当编写并且编译一个新类,就会产生一个Class对象(被保存在同名的.class文件当中)

2。instanceof 关键字用于检查对象是不是某个特定类型的实例。

3。强制类型转换,如:
Parent object = new Child();
Child child = (Child)object;

至于实现机制,根据JVM实现的不同,没有固定的答案。

 

PS:

RTTI主要主要针对对象:Class对象。Class对象存放着对应类所需要的所有的类型信息,包括类的变量,类的属性,类的超类,类实现的借口,类的修饰符,类的对应的类的加载器等等
    所有类都在第一次使用时,动态加载入jvm当中,当程序创建对类的第一个静态引用时,就会加载这个类,同时构造器可以看作是一个静态方法。
    jvm是动态加载的,你需要什么我给你加载什么,这样的话,类加载器第一次使用该类时,他会检查这个类的class对象,有没有被加载,如果没有加载,就载入这个class对象,加载时需要对class文件验证,包括文件头,文件大小,文件内容语义检查,各类字符串引用检查等等,载入后,还有链接和初始化等两个步骤。
常常初始化行为被延迟到了对静态方法或者非常量静态域进行首次引用时才被执行。对于常量静态域是因为他在编译器的时候,已经被搞定了。
此外RTTI的表现形式有:
    1.进行类型转换,这个主要是进行向下类型转换时使用,可以概括为:你是什么类型就可以从基类型转化什么类型

    2 通过查询class对象可以获取运行时的所需的信息

相关文章:

  • (转)memcache、redis缓存
  • java的编译时多态和运行时多态
  • java多态的实现机制
  • DOM Tree
  • Java 动态代理机制分析
  • powershell递归删除文件
  • Java 静态代理和动态代理
  • 【Python开发】Python之re模块 —— 正则表达式操作
  • 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap
  • 不需内测账号,带你体验微信小程序完整开发过程
  • java synchronized与lock区别
  • 深入剖析Java编程中的中文问题及建议最优解决方法
  • linux系统安装php扩展
  • 从Decorator,Adapter模式看Java/IO库
  • 【神经网络与深度学习】什么是HDF
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《深入 React 技术栈》
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Apache Zeppelin在Apache Trafodion上的可视化
  • maya建模与骨骼动画快速实现人工鱼
  • 笨办法学C 练习34:动态数组
  • 从零开始在ubuntu上搭建node开发环境
  • 二维平面内的碰撞检测【一】
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 构建工具 - 收藏集 - 掘金
  • 强力优化Rancher k8s中国区的使用体验
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据科学 第 3 章 11 字符串处理
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​学习一下,什么是预包装食品?​
  • #FPGA(基础知识)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (13)Hive调优——动态分区导致的小文件问题
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (办公)springboot配置aop处理请求.
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (四)模仿学习-完成后台管理页面查询
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Java算法:二分查找
  • .gitignore文件设置了忽略但不生效
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net下的富文本编辑器FCKeditor的配置方法
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [AAuto]给百宝箱增加娱乐功能
  • [ACTF2020 新生赛]Include
  • [CSS3备忘] transform animation 等
  • [DM复习]关联规则挖掘(下)
  • [Enterprise Library]调用Enterprise Library时出现的错误事件之关闭办法
  • [hibernate]基本值类型映射之日期类型
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [Linux] CE知识随笔含Ansible、防火墙、VIM、其他服务