------------翁恺老师授课
第四次课程 继承与多态
继承:子类继承父类的成员变量及方法
多态:方法的重载
继承
class 子类 extends 父类{
//为什么使用extends呢? 因为子类是单数,所以加“s”
}
子类可以继承父类的静态变量和方法,但不能覆盖
- 子类可以不用申明直接使用父类中的可访问成员;
- 子类不能删除任何从父类继承来的成员;
- 子类不可以重新定义继承得到的成员的访问属性。
- 子类如果一定要重新定义一个在父类已经存在的成员变量,那是在定义一个与父类的成员变量完全无关的变量。此时子类中使用的变量是离其最近的变量。
哪些成员属于可访问?
由public、private、protected、缺省决定
protected----只有在包内其他类、自己和子类可以访问
缺省----只有包内其他类可以访问。如果子类和父类在同一包内,可以访问;否则,相当于private,不可以访问。
子类父类关系
构造方法
- 子类不继承父类构造方法,可通过super调用。
- super有且<=1,若有super,必须出现在子类构造方法内所执行的第一条语句。super语句根据参数列表适配。
为什么一定要先父类后子类呢?-----子类继承并使用父类的成员变量,必须先在父类中申明这个变量。
构造方法执行流程:
- 为若干子类成员变量及继承来的开辟空间
- 去父类的构造方法
A.父类定义初始化
B. 父类构造器初始化 - 去子类的构造方法
A. 子类定义初始化
B. 子类构造器初始化
引用父类同名成员
- 子类重定义父类的成员变量:
int i;//子类
super.i;//父类
- 子类重定义父类的方法
使用super.XX访问(若参数列表有所区别,不需要使用super)
多态变量和向上造型
多态变量可以保存其所声明的类型或该类型的任何子类型(同一款玻璃杯子,大杯子可以装其容量之下的杯子里的水)。动态类型(在运行时所管理的对象类型)。
向上造型:把子类的对象赋给父类的变量时发生向上造型。一次性,暂时看做其他类型。可以将实例化后的子类赋给参数是父类的方法。
子类的对象可以被当做父类的对象来使用:
- 赋值给父类的变量;
- 传递给需要父类对象的函数;
- 放进存放父类对象的容器里。
向下造型:高赋给低。只有当类赋值的右边变量管理的类型与左边的静态类型一致时才会造型成功,且必须有强制发生造型的格式。
class 类A extends 类B{
.....
public static void main(String[] args){
类A a = new 类A();
类B b = new 类B();
b = a; // 向上造型
类A c;
c = b; //直接赋是不可以的,必须经过向下造型
c = (类B)b; //向下造型,此时b的动态类型是类A
}
}
多态
多态:一个方法可以有多种实现版本
- 重载:同一类中多个方法同名,但参数列表不同(必须不同)。
- 覆盖:子类重新定义父类中同名的方法,参数列表完全相同。(并不是说父类中的方法不存在,当一个子类的对象调用该方法时,子类中的方法取代了父类的方法)。
调用哪一个方法取决于调用该方法的对象所属的类并向上寻找。 当前对象所属类---->父类---->祖先类
类型系统
类型系统会根据方法的参数或调用方法的对象自动选择一个方法执行,不会混淆。