这次总结一下阅读了《Java核心技术卷1》继承章节的相关知识点。
重载和重写
重载和重写算是本章遇到的第一个基础却又无比重要的概念了。在书中将重写翻译成了覆盖,不过并不影响学习。
重写:一般指的,子类对父类中存在的方法,进行重新的定义。要求是,方法头(包括参数表、函数名、返回值、访问关键字)应与原父类方法保持一致。重写,写的是方法内的代码,发生在子类中。实现运行时的多态
重载:指代在同一类中,对相同方法名的方法,进行重新的定义。其判断标准在于,重载必须要改变原方法的参数表。其返回值、访问关键字均可以改变。实现编译时的多态
所以,区分重写和重载的重要标准就是,方法的参数表是否发生了改变。
关键字super
super关键字一般有两个用处:1、用于调用父类被重写的方法。2、调用父类构造器。与this不同的是,super只是一个指示编译器调用超类方法的特殊关键字。
同时,调用父类构造器必须是子类构造器的第一条语句。如果没有显式调用,那么将自动调用无参数的父类构造器。若父类中没有无参数的构造器或是没有显式调用其他父类构造器,则编译器将报错。
多态
一个对象变量可以指示多种实际类型的现象称为多态。
多态,即一个对象变量既可以引用本类对象,也可以引用其子类对象。但当引用其子类对象时,所使用的实例域和方法均只能是父类的。注:当父类对象变量的值需要赋给子类对象变量时,需要在赋值前判断父类对象变量引用的是实际对象是不是子类对象。若不是,则无法赋值。
方法调用
调用过程如下:
1、编译器查看对象的声明类型和方法名。找到其类型中所有方法名相同的方法,以及其父类中声明为public、protected的相同方法名的方法。
2、接下来,编译器查看这些符合要求的方法的参数表。找到参数表相对应的方法。这个过程称为,重载解析。若编译器没有找到符合要求的方法或是找到多个符合的方法,则依旧会报错。
3、如果是private方法、static方法、final方法或者构造器,那么编译器是可以准确知道应该调用哪个方法的。这种方式称为静态绑定。与此对应的是,调用方法依赖于隐式参数的实际类型,并且运行时实现动态绑定。
4、当程序运行时,并且采用动态绑定调用方法时,虚拟机一定调用与对象变量所引用对象的实际类型最合适的那个类的方法。
由于每次调用时搜索的开销相当大。虚拟机预先为每个类创建了一个方法表。当采用动态绑定调用方法时,直接搜索相应类的方法表匹配即可。
final类和方法
当某个类被final关键字修饰,即代表该类是无法被扩展的。类中方法有时也会被final修饰,这样该类就无法被子类覆盖。
String类就是final类。
抽象类
抽象类即被abstract修饰的类。该类无法被实例化,只能被其他子类扩展。类中如果有一个或多个被abstract修饰的方法,则该类一定要被abstract修饰。同时,若子类没有实现全部abstract方法,则该子类依旧只能是抽象类。
同时,如果声明了一个抽象类变量,并引用它的子类对象。调用相关方法时,只会调用子类的对应方法。