Class.forName("");获取输入字符串名字的类或接口关联的Class对象;
obj.getClass():从实例对象获取
A.class:类型的字面常量。
包含的信息: 描述类的相关信息,叫什么、血缘、能力、创建1个
特点:
相关实体:
实践中接口的约定被破坏;可以尝试通过内部类约束调用者行为。
Rtti与多态:尽量使用多态;rtti是对多态的补充。
反射更动态、更多运行时异常
本章知识的脉络是:
多态自动调用实际对象的方法,抽象类防止直接创建实例、保证函数被重写
&:1.常见的多态代码;
2.父类的数组引用类型指向的数组,由各种子类构成;统一调用父类定义的函数,实现多态。
3.抽象类的作用:防止创建实体类;抽象函数的作用:保证被重写。
4.此时:数组引用是不知道每个对的具体类型的,如果能知道最精确的类型,可以针对特定类型处理。如把三角形画出来并上色。就需要rtti。
Class对象只有在被第1次调用static方法时,才会加载。
&:创建类,且包含static代码块,检查static代码块的执行时机,确认是用到时才加载,不是程序执行就加载。
使用Class对象的常用方法:getName|isInterface|getInterfaces|getSuperclass|newInstance
&:描述类:姓名、血缘、能力。
1.Class.newInstance():使用的无参构造函数,保证类有无参构造函数。
2.向上转型可以;平行子类间转型,编译器会提示;强制转报异常ClassCastException。
3.递归调用继承树,可使用String的endsWith(“.Object”)判断。
基本知识:
1.instanceof:java的保留关键字,是二元操作符,用来检查左边对象是否是右边Class类型的实例。
eg:cat instanceof Cat。
…:3个点,可变长度参数列表,支持0个或多个参数。
ps:相对对象数组的优势是,允许0个参数。
用在反射,构造函数中,因为不知道到底调用哪个构造函数,最终根据传入的参数个数和类型确定。
通过反射调用构造器的传参问题?
&:构造器入参是可变长度的Object对象,即可穿入任意个、任意类型的Object,然后根据类型匹配构造器。
ps:这应该是为了支持反射,必须具备的能力,否则反射的构造器、函数无法使用,因为传参时不知道。
简单代理的例子:自己和教程对比,忽略了消费者,体现不出实现1个接口的意义。
面向对象的编程:增加了类型信息。
**多态:**在调用者看来,同样的代码(传入父类引用),执行不一样的结果。实际是不同的子类。扩展,不用修改外部调用代码。
**面向过程:**没有类型信息,必须是不同的函数。如果扩展,必须修改代码。