为什么须要RTTI
package rtti;
import java.util.Arrays;
import java.util.List;
abstract class Shape {
void draw() {
System.out.println(this + ".draw()");
}
abstract public String toString();
}
class Circle extends Shape {
@Override
public String toString() {
return "Circle";
}
void sayHello() {
System.out.println("hello");
}
}
class Square extends Shape {
@Override
public String toString() {
return "Square";
}
}
public class Shapes {
public static void main(String[] args) {
List<Shape> shapeList = Arrays.asList(new Circle(), new Square());
//容器的所有事物都当作object持有,当取出时会主动转型为Shape
for (Shape shape :
shapeList) {
shape.draw();
}
}
}
- RTTI名称的含意:在运行时,辨认一个类型的类型
- 面向对象编程中根本的目标是,让代码只操纵对基类的援用,多态
- 有时须要操作特定类的独有办法,而这是无奈从基类获取的,这就是应用RTTI的意义
Class对象
- 类型信息在运行时由Class对象示意,每个类都有一个Class对象,蕴含与类相干的信息
- 每当编译一个新类,就会由jvm中的类加载器子系统生成一个同名的Class对象(.class)
- 类加载器子系统是一条类加载器链,原生的类加载器加载可信类,包含java api类,也能够额定减少类加载器
- 所有类都是在第一次应用的时候(创立第一个对类的动态成员的援用时),动静加载到jvm中。这阐明,结构器也是动态的。
- 一旦某个类的Class对象被载入内存,它就被用来创立这个类的所有对象
- 想在运行时应用类型信息,就必须先取得对Class对象的援用
发表回复