thingking in java 读书笔记---RTTI
来源:互联网 发布:linux vi 查找上一个 编辑:程序博客网 时间:2024/05/16 01:37
RTTI,看完了这一章,我才算是明白了java的强大之处,运行时刻类型检查,我想MFC中对RTTI的实现应该是模仿的java吧,至少它们的机理是一样的,不过java中RTTI功能工强大一些。
RTTI可以分两种类型,一种就是传统的RTTI,它假定我们在编译期就知道所有的类型,基本上多数的应用程序都属于这一种。另外一种更牛,是reflection发射机制,它能在我们的程序中没有这个类的定义源代码的时候,就能获得这个类的函数接口。
先说第一种,java中向上转型是自动的,因为不会有信息丢失,一定能行得通,因为子类就是父类的一种。向下转型的时候,我们就需要强制类型转换,这个语法与c++中是一样的,实现却不同,c++中需要有程序员来确保转型逻辑的正确,而java中更安全,虚拟机在运行时刻可以进行类型检查,确保转型的正确性,否则抛出ClassCastException,这是RuntimeException的子类。
Class类:RTTI的实现主要靠的就是这个Class类,类型信息都存储在Class 对象中,其实,Class 对象正是被用来创建常规对象的。每当你编写编译一个类时,就会产生这个类的Class 对象(存储在同名的.class文件中)。要生成这个类的常规对象,首先检查这个类的Class 对象是否已经加载。
常规类和其对应的Class对象的引用的获得方法:
从类名字ClassName到其Class 对象的引用:
Class.forName(“ClassName”);
ClassName.class //基本数据类型也可以,如int.class
ClassObject.getClass //需要已经存在的对象,不是static的方法。
从Class 对象构建常规对象:
使用Class对象的newInstance函数。调用的是没有参数的构造函数。
判断一个对象的类型:3种方法。
1. instanceof关键字
语法: if(x instanceof Dog){…}
其中x是某个对象的引用,Dog是个类的名字。
2. Class.isInstance()方法。功能一样,语法不同。
语法:if(classA.isInstance(o){…},其中,classA是Class对象,o是某个常规对象的引用。
点评一下,上面两个方法有一个特点。判断一个对象是不是属于某个类的时候,会体现出继承的关系,比如class A Extends B{}.在判断B的对象是不是属于A类的时候,得到true。
3. if(x.getClass()==ClassName.class)
if(x.getClass().equals(ClassName.class))
上面两种方法功能完全一样。比较的时候,不会体现出继承关系。子类对象与父类比较时,得到false。
//////////////////////////
reflection 反射
这是更高级的东西,从Class 对象里面可以直接提取出类的函数信息。这个功能可以与c++对比,当然有个前提是需要类的.class 文件,也就是需要对应的Class 对象。
这个功能使得java能构支持基于构件的编程,javabean,在远程创建和运行对象。
具体的语法见Class类的函数:
getFields获得成员列表() //
getMethods() //获得函数列表
getConstructors() //获得构造器列表
- thingking in java 读书笔记---RTTI
- thingking in java读书笔记3
- thingking in java 读书笔记---对象引论
- thingking in java 读书笔记----一切都是对象
- thingking in java 读书笔记---控制程序流
- thingking in java 读书笔记---初始化和清除
- thingking in java 读书笔记---异常处理
- thingking in java 读书笔记---复用和多态
- thingking in java 读书笔记----接口和内部类
- thingking in java 读书笔记---对象集合和容器
- thingking in Java 字符串
- thingking in Java 泛型
- thingking in Java 数组
- thingking in Java 注解
- thingking in Java 并发
- Thingking in Java学习笔记
- Thingking in Java 注册工厂
- thingking in Java 类型信息
- J2ME手机文件加密
- 认识色彩
- 《重构——改善既有代码的设计》
- 小i机器人
- 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。
- thingking in java 读书笔记---RTTI
- 最近比较烦!
- 《人件》
- 转贴]VC中Unicode字符串的处理
- 求助一下吧!
- 世界五大汽车公司
- perl多线程,想说爱你不容易。。。
- 为什么不多一个camera?
- Linux 网络管理器