thingking in java 读书笔记---RTTI
2007-05-11 21:35
253 查看
RTTI,看完了这一章,我才算是明白了java的强大之处,运行时刻类型检查,我想MFC中对RTTI的实现应该是模仿的java吧,至少它们的机理是一样的,不过java中RTTI功能工强大一些。
RTTI可以分两种类型,一种就是传统的RTTI,它假定我们在编译期就知道所有的类型,基本上多数的应用程序都属于这一种。另外一种更牛,是reflection发射机制,它能在我们的程序中没有这个类的定义源代码的时候,就能获得这个类的函数接口。
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(xinstanceofDog){…}
其中x是某个对象的引用,Dog是个类的名字。
2.Class.isInstance()方法。功能一样,语法不同。
语法:if(classA.isInstance(o){…},其中,classA是Class对象,o是某个常规对象的引用。
点评一下,上面两个方法有一个特点。判断一个对象是不是属于某个类的时候,会体现出继承的关系,比如classAExtendsB{}.在判断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 读书笔记---初始化和清除
- thingking in java 读书笔记---对象引论
- thingking in java 读书笔记---复用和多态
- thingking in java 读书笔记---异常处理
- thingking in java 读书笔记----接口和内部类
- thingking in java 读书笔记---控制程序流
- 2016-1-7-Thingking in Java 读书笔记(三)--操作符
- thingking in java 读书笔记----一切都是对象
- 2016-1-7-Thingking in Java 读书笔记(四)---控制执行流程
- thingking in java 读书笔记---对象集合和容器
- Thingking in Java 注册工厂
- thingking in Java 数组
- thingking in Java 容器深入研究
- 看完thingking in java 想向J2EE方向发展接下来该看看那些比较好
- thingking in java test2.11(11)
- Thingking in Java学习笔记 wait() notifyAll()
- thingking in Java I/O系统
- thingking in Java 类型信息
- thingking in Java test3.7练习(5)(6)
- thingking in java test2.11练习(10)以及IDE中args的提前输入