继承(inheritance)就是基于我们已有的类去复用这些类的方法,并增加一些新的方法与字段。继承毫无疑问是我们经常使用的较为熟悉的,本篇仅作一个简要笔记大纲。
01类、超类、子类
超类,或则叫父类与子类或者叫派生类是典型的is-a类。由于子类时继承了父类,所以往往子类会拥有比父类更多的功能。
覆盖方法(Override):由于父类中的一些字段时私有的,我们不能直接调用,若此时我们直接调用父类方法会导致我们的调用与父类无关,此时可以使用super.方法来调用父类方法。
子类构造器:采用super字段同样可以显式的调用父类中的参数的构造器,若子类的构造器没有显示的调用超类的构造器,那么将自动调用超类的无参构造,但若两者都没有,那么编译器就会报错。
在编写子类的对象变量时,由于子类含于父类,故会出现在使用方法时,若引用父类对象与子类对象其实际调用的方法时不同的。故一个变量对象可以指示多种实际类型的现象我们称之为多态,而其在运行时能够自动的选择适当的方法,我们则称之为动态绑定。
继承可以是一个父类派生出多个子类,再依次类推,而这种关系网我们称之为继承链。
理解方法调用:
1、编译器查看对象的声明类型和方法名;
2、编译器确定方法调用中提供的参数类型;
3、若为provate、static、final方法或者构造器,那么编译器将可以准确地直到应该调用哪个方法(即静态绑定);
4、程序运行并且采用动态绑定调用方法时,虚拟机必须调用与之所引用对象的实际类型所对应的方法(虚拟机会预先有一个方法表,运行时会查询这个表);
强制类型转换:我们有时候需要将某个类对象的类型引用转换为另一个类的对象引用。这就需要强制类型转换。写法为加上(目标类型名)。我们进行强制类型转换的唯一原因是:要暂时忽略对象的实际类型之后使用对象的全部功能。同时值得注意的是:
首先,只能在继承的层次内进行强制类型转换;
其次,将父类转换成子类之前,应该使用instanceof来检查(即父类引用赋予一个子类可能会承诺过多,我们检查的就是此类情况)。
抽象类:抽象的类的诞生是我们在扩展类层次结构的时候,需要一个更加概括的类,并去定义一些公用的方法,当然这个方法我们并不需要去实现他,我们可以使用abstract关键字。此时,包含一个或者多个抽象方法的类本身必须被声明成抽象的。除了抽象方法之外,抽象类还可以包含字段和具体方法。在抽象类中定义的方法起着占位方法的作用,它们将在子类中具体实现。此外,即使不含有抽象方法,也可以将类声明为抽象类。值得注意的是,抽象类不能被实例化,我们可以定义一个抽象类的对象变量,但是这样一个变量只能引用菲抽象子类的对象。
protected:访问修饰符中定义只能本包和所有子类可见。但由于修改父类非常危险,慎重使用。
02泛型数组列表
Arraylist类,这个类类似于数组,不同的是她能自动的调整数组容量,其是一个有类型参数的泛型类。
我们使用add来添加元素,而set方法为替换数组中已经加入的元素。
03对象包装器与自动装箱
每一个基本类型都有与之对应的类(如int之于Integer,char与Character),我们称之为包装类。包装类是不可改变的,一旦构造了包装类,就不允许更改包装类的值。此外,包装类不能派生子类。使用包装类,我们可以很方便地使用我们所对应的基本类型,这称之为自动装箱。相反,将一个包装类对象赋予一个基本类型则称之为自动拆箱。
04反射
反射库提供了一个丰富且精巧的工具集,可以用来编写动态操纵Java代码的程序。
首先,我们需要了解Class类。在程序运行期间,Java系统始终为所有对象维护一个运行时类型标识。我们可以用Class这个特殊的Java类来访问保存这些信息。获取Class类对象有三种方式:
1、getClass()方法;
2、使用静态方法forName来获得对应的Class对象;
3、任意类型的Java类.Class来创建;
值得注意的是,Class对象实际上表示的是一个类型,这可能是类,也可能不是类。
利用反射分析类的能力:在反射包中,有三个类Field,Method,Constructor分别用于描述类的字段、方法和构造器。并都有getName方法来返回名称。
使用反射在运行时分析对象,我们可以对Class类上调用getDeclaredFields.
使用反射来编写泛型数组代码:首先获取a数组的类对象,其次确认它确实是一个数组,使用Class类的getCopmponentType方法确定数组的正确类型。
反射机制可以允许你调用任意的方法,例如Method类有一个invoke方法,其允许你调用包装在当前Method对象中的方法。
05继承的设计技巧
1.将公共操作和字段放在超类中。
2.不要使用受保护字段。
3.使用继承实现is-a关系。
4.除非所有继承方法都有意义,否则不要使用继承。
5.在覆盖方法时,不要改变预期的行为。
6.使用多态,而不要使用类型信息。
7.不要滥用反射(尤其是在使用反射后,编译器将无法帮助你查找编程错误)。