- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 四 章 (下) 多 态 回顾 继承是指从一个基类(父类)派生出派生类(子类)的过程; 继承使用关键字extends; 对于类成员,可以使用public、protected、缺省和private这4种访问权限修饰符; 对于类,可以使用public和缺省这2个访问权限; 创建子类实例时,必须先执行父类的构造方法,然后再执行子类的构造方法; super关键字有两种主要用途,都与父类有关。 本章相关词汇(蓝色为关键字) 本章目标 方法覆盖 引用转型 了解多态,在Java中实现多态 抽象方法和抽象类,abstract关键字 接口和实现接口,interface关键字和implements关键字 final关键字 类与类之间的关系(补充) 父/子类中的同名成员 上次课在讲述super关键字时,提到了父类和子类中存在同名成员的情况; 如果是同名属性(即成员变量同名),那么可以通过this和super显式地区分开来; 如果是同名方法(即成员方法同名),情况将会相对复杂。 父/子类中成员方法仅仅同名 父/子类中成员方法同原型 方法覆盖 在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法重写); 通过子类的实例调用被覆盖的方法时,将总是调用子类中的方法,而父类中的方法将被隐藏。 方法覆盖示例 区分方法覆盖和方法重载 方法覆盖(重写)和方法重载是两个极易混淆的概念,必须严格区分; 方法覆盖出现的前提条件之一是必须有继承发生的情况下,而且要求父类和子类中的方法必须同原型; 方法重载时,继承并不是必需的,它只要求方法名称相同,而参数列表则必须不同,换言之,各方法的原型其实是不同的。 引用转型 基类的引用可以指向派生类的对象,如: BaseClass obj = new DerivedClass(); 这样的语句是合法的; 但是派生类的引用则不可以指向基类的对象,如: DerivedClass obj = new BaseClass(); 这样的语句将引发错误。 引用转型示例 问题 既然基类的引用可以指向派生类的实例,如果基类和派生类中存在方法覆盖的情况,那么通过基类的引用将会调用到哪个类中的方法呢? 示例 多态 从上例中可以看出,父类的引用指向哪个类的实例就调用哪个类中的方法; 同样是使用父类的引用,调用同一个名称的方法,却可以得到不同的调用结果,这就是Java中的多态,即:同一函数,多种形态; 实际上多态包括动态多态和静态多态。 静态多态 静态多态也称为编译时多态,即在编译时决定调用哪个方法; 静态多态一般是指方法重载; 只要构成了方法重载,就可以认为形成了静态多态的条件; 静态多态与是否发生继承没有必然联系。 动态多态 动态多态也称为运行时多态,即在运行时才能确定调用哪个方法; 形成动态多态必须具体以下条件: 必须要有继承的情况存在; 在继承中必须要有方法覆盖; 必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法; 由上述条件可以看出,继承是实现动态多态的首要前提。 抽象方法 在某些情况下,基类无法(或者没有必要)提供被覆盖方法的具体实现,那么就可以将此方法声明成抽象方法; 使用关键字abstract声明抽象方法,一般语法: [访问权限] abstract 返回值类型 方法名称(参数列表); 如: public abstract void draw(); 抽象类 如果某个类中包含有抽象方法,那么该类就必须定义成抽象类; 定义抽象类同样使用关键字abstract,一般语法: [访问权限] abstract class 类名 { 成员列表 } 如: public abstract class Shapes { public abstract void draw(); } 抽象类的注意事项 抽象类不可以直接实例化,只可以用来继承; 抽象类的派生子类应该提供对其所有抽象方法的具体实现; 可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型; 如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化; 抽象类中也可以包含有非抽象的方法; 构造方法和静态方法不可以修饰为abstract。 修改前面的案例 接口 如果某个类中的所有方法都是抽象方法,那么可以考虑将该类定义为接口; 定义接口使用关键字interface,一般语法: [访问权限] interface 接口名 { 成员列表 } 如: public interface IMyInterface { …… } 实现接口 与抽象类相似,接口同样不可以实例化,只能用于实现; 如果某类要实现接口,则使用im
文档评论(0)