Java学习笔记之十 继承
继承,inheritance。利用继承,人们可以基于已经存在的类构造一个新类。
继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加新的方法和域。
反射,reflection。反射,指在程序运行期间发现更多的类及其属性的能力。
类、超类、子类
class Manager extends Employee
{
...
}
is-a关系是继承的一个明显特征。
关键字extends表示继承。
在Java中,所有的继承都是公有继承。
关键字extends表明正在构造的新类派生于一个已经存在的类。已存在的类被称为超类,superclass、基类,base class,或父类,parent class。新类被称为子类,subclass,派生类,derived class,或孩子类,child class。
如果需要调用超类的方法,可以使用关键字super。
super不是一个对象的引用,不能将super赋值给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。
在子类中可以增加域、增加方法或覆盖(override)超类的方法。绝对不能删除继承的任何域或方法。
继承层次。继承并不仅限于一个层次。
多态。在Java程序设计语言中,对象变量是多态的。
动态绑定。
阻止继承:final类和方法。
不允许扩展的类被称为final类。如果在定义类的时候使用了final修饰符,就表明这个类是final类。
类中的方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法。final类中的所有方法会自动成为final方法。
强制类型转换。
只能在继承层次内进行强制类型转换。
在将超类转换称子类之前,应该使用instanceof进行检查。
抽象类。
受保护访问。使用proteced关键字。
Java用于控制可见性的4个访问修饰符:
- 仅对本类可见。private。
- 对所有类可见。public。
- 对本包和所有子类可见。proteced。
- 对本包可见。默认。不标注。
Object:所有类的超类
Object类是Java中所有类的最终祖先。
如果没有明确地指出超类,Object就被认为是这个类地超类。
泛型数组列表
Java允许在运行时确定数组的大小。
一旦确定了数组大小,要改变它们就不容易了。
Java中有一个ArrayList类。使用起来有点像数组,但添加或删除元素时,具有自动调节数组容量的功能。
在Java SE 5.0中,ArrayList是一个采用类型参数type parameter的泛型类generic class。
对象包装器与自动打包
有时,需要将int这样的基本类型转换为对象。
所有的基本类型都有一个与之对应的类。这些类被称为包装器wrapper。
对象包装器类:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean(前6个类派生于公共的超类Number)。
对象包装器类是不变的,一旦构造了包装器,就不允许更改包装在其中的值。
对象保证器类是final类,不能定义它们的子类。
参数数量可变的方法
在使用上和参数数组差不多。
枚举类
枚举类型的声明实际上是声明了一个枚举类。
如果需要的话,可以在枚举类型中添加一些构造器、方法和域。
反射
反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。
能够分析类能力的程序被称为反射(reflective)。
Class类。
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹。
可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class。
继承设计的技巧
将公共操作和域放在超类。
不要使用受保护的域。
使用继承实现is-a关系。
除法所有继承的方法都有意义,否则不要使用继承。
在覆盖方法时,不要改变预期的行为。
使用多态,而非类型信息。
不要过多地使用反射。