1.定义子类:
已经存在的类称为超类、基类或父类
新类称为子类、派生类或孩子类
2.覆盖方法:
子类覆盖父类中的同名方法之后,如果想要调用父类中的同名方法可以使用关键字super
例如:super.getXxxx();
因为有时候只有调用父类中的同名方法才可以访问父类中的私有域
3.子类构造器:
在子类构造器中调用父类的构造器:
例如:
public Manager(String name,double salary,int year,int month,int day){
super(name,salary,year,month,day);
bonus = 0;
}
super调用构造器的语句必须是子类构造器的第一句
一个对象变量可以指示多种实际类型的现象被称为多态
在运行时能够自动地选择调用哪个方法的现象称为动态绑定
4.继承层次:
由一个公共超类派生出来的所有类的集合称为继承层次
从某个特定的类到其祖先的路径被称为该类的继承链
5.理解方法调用:
编译器查看对象的声明类型和方法名
编译器将会一一列举该类中名为XXX的方法和其超类中访问属性为public且名为XXX的方法
编译器还将查看调用方法时提供的参数类型,就是在所有名为XXX的方法中查找一个与提供的参数类型完全匹配的方法,这个过程被称为重载解析
如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,这种调用方式成为静态绑定
每次调用方法都要进行搜索,时间开销相当大,因此虚拟机先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法
动态绑定有一个非常重要的特性:无需对现存的代码进行修改,就可以对程序进行扩展
在覆盖一个方法的时候,子类方法不能低于超类方法的可见性
6.阻止继承:final类和方法:
final类中的所有方法自动地成为final方法,但是不包括域
如果一个方法没有覆盖并且很短,编译器就能够对它进行优化处理,这个过程为称为内联
例如:内联调用e.getName()将被替换为访问e.name域
虚拟机中的即时编译器可以准确地知道类之间的继承关系,并能够检测出类中是否真正存在覆盖给定的方法
如果方法很简短、被频繁调用且没有真正地被覆盖,那么即时编译器就会将这个方法进行内联处理
如果虚拟机加载了另一个子类,而在这个子类中包含了对内联方法的覆盖,那么优化器将取消对覆盖方法的内联
7.强制类型转换:
在进行类型转换之前,先查看一下是否能够成功地转换
例如:if(staff[1] instanceof Manager){
boss = (Manager) staff[1];
}
对象类型转换的要求:
只能在继承层次内进行类型转换
在将超类转换成子类之前,应该使用instanceof进行检查
8.抽象类:
包含一个或多个抽象方法的类本身必须被声明为抽象的
抽象方法充当占位的角色,它们的具体实现在子类中
抽象类不能被实例化
9.受保护访问:
超类中的某些方法允许被子类访问,或允许子类的方法访问超类的某个域,为此需要将这些方法或域声明为protected
仅对本类可见——private
对所有类可见——public
对本包和所有子类可见——protected
对本包可见——默认