继承与相等测试
(objectA instanceof Class) 返回 boolean
对象相等( 堆内存中) aObject.equals(bObject)
以上两个方法属于 Object 类, 所以所有的类都可以使用.
反射
反射库提供了一个非常丰富且精心设计的工具集, 以便编写能够动态操作java代码的程序, 这项功能被大量的应用于javabeans中.
能够分析类能力的程序被称为反射(reflective)
java 反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 能够调用它的任意一个方法和属性; 这种动态获取信息以及动态调用对象的方法的功能称作 java 反射.
动态语言定义: 程序运行时, 准许改变程序结构或变量类型, 这种语言称为动态语言.
在 Object 这个类中有个 getClass() 方法, 可以用来返回当前正在运行的类. 例如:
Date d = new Date();
Class cl = d.getClass();
String name = cl.getName(); // name is set to "java.util.Date"
可以利用反射的分析能力, 比如你要对一个对象进行某个操作, 可以先通过这个反射判断当前对象是不是你像要得对象. 而因为反射是在运行时实现的, 是动态的, 所以是最准确的, 如果是普通判断, 很可能因为动态执行时的改变, 而影响了正确的结果.
java 反射的作用就是增加程序的灵活性, 例如:
实例化一个 person()对象, 不使用反射 new person(); 如果想变成实例化其他类, 那么必须修改源代码, 并重新编译, 如果使用反射, class.forName("person").newInstance(); 而且这个类的描述可以写到配置文件中, 如 *.xml, 这样就可以实例化其他类了, 只要修改配置文件的"类描述"就可以了, 不需要重新修改编译代码.
个人感觉: 反射的作用一般, 可以不用考虑.
继承的设计技巧
1) 将公共操作和域放在超类( 这里的域只实例变量 )
2) 不要使用保护的域( 不要使用 protected, 虽然 protected 子类能够直接访问它们, 然后, protected机制并不能带来更好的保护, 其只要原因有两点, 子类集合无限制, 任何一个人都能够由某个类派生一个子类, 并编写代码直接访问 protected实例域, 从而破坏了封装性. 另外, 在同一个包中, 其他所有的类都可以访问protected的实例域, 不管它是否是这个类的子类.
3) 使用继承实现 "is-a" 关系
4) 除非所有继承的方法都有意义, 否则不要使用继承. 即父类中存在某个public方法, 对子类来说是没有意义的, 这也同时说明了, 子类和父类不是"is-a" 关系.
5) 在覆盖(父类方法)时, 不要改变预期的行为.
6) 使用多态, 而非类型判断( 例如: sharp, 三角形, 正方形, 新增图形 )
7) 不要过多使用反射(反射可以在运行时检查方法和域, 让人们编写出更具有通用的程序, 这种功能通常适合编写系统程序, 通常不适合应用程序)