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关系。

除法所有继承的方法都有意义,否则不要使用继承。

在覆盖方法时,不要改变预期的行为。

使用多态,而非类型信息。

不要过多地使用反射。