第四章(下)多态课件

上传人:我*** 文档编号:144715556 上传时间:2020-09-13 格式:PPT 页数:34 大小:173.50KB
返回 下载 相关 举报
第四章(下)多态课件_第1页
第1页 / 共34页
第四章(下)多态课件_第2页
第2页 / 共34页
第四章(下)多态课件_第3页
第3页 / 共34页
第四章(下)多态课件_第4页
第4页 / 共34页
第四章(下)多态课件_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《第四章(下)多态课件》由会员分享,可在线阅读,更多相关《第四章(下)多态课件(34页珍藏版)》请在金锄头文库上搜索。

1、多 态,第 四 章 (下),继承是指从一个基类(父类)派生出派生类(子类)的过程; 继承使用关键字extends; 对于类成员,可以使用public、protected、缺省和private这4种访问权限修饰符; 对于类,可以使用public和缺省这2个访问权限; 创建子类实例时,必须先执行父类的构造方法,然后再执行子类的构造方法; super关键字有两种主要用途,都与父类有关。,回顾,本章相关词汇(蓝色为关键字),本章目标,方法覆盖 引用转型 了解多态,在Java中实现多态 抽象方法和抽象类,abstract关键字 接口和实现接口,interface关键字和implements关键字 fin

2、al关键字 类与类之间的关系(补充),父/子类中的同名成员,上次课在讲述super关键字时,提到了父类和子类中存在同名成员的情况; 如果是同名属性(即成员变量同名),那么可以通过this和super显式地区分开来; 如果是同名方法(即成员方法同名),情况将会相对复杂。,父/子类中成员方法仅仅同名,class BaseClass /定义基类 public void fun() /具体实现代码略 class DerivedClass extends BaseClass /派生类继承于基类 public void fun(int x) /跟父类中有相同名称的方法 /具体实现代码略 /*如果仅仅只是名

3、称相同,但参数列表不同的话,则构成方法重载*/,父/子类中成员方法同原型,class SuperClass /定义父类 public void fun() /具体实现代码略 class SubClass extends SuperClass /子类继承于父类 public void fun() /与父类中的方法完全同原型 /具体实现代码略 /*如果不但名称相同,而且连方法原型也完全相同的话,则构成方法覆盖*/,方法覆盖,在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法重写); 通过子类的实例调用被覆盖的方法时,将总是调用子类中的方

4、法,而父类中的方法将被隐藏。,方法覆盖示例,class ParentClass /定义父类 public void fun() System.out.println(这是父类中的方法。); class ChildClass extends ParentClass /子类继承于父类 public void fun() /子类覆盖父类中的方法 System.out.println(这是子类中的方法。); class OverriddenTest /用于容纳main方法 public static void main(String args) ParentClass parObj = new Par

5、entClass(); parObj.fun(); /父类的实例调用此方法 ChildClass chiObj = new ChildClass(); chiObj.fun(); /子类的实例调用此方法 ,区分方法覆盖和方法重载,方法覆盖(重写)和方法重载是两个极易混淆的概念,必须严格区分; 方法覆盖出现的前提条件之一是必须有继承发生的情况下,而且要求父类和子类中的方法必须同原型; 方法重载时,继承并不是必需的,它只要求方法名称相同,而参数列表则必须不同,换言之,各方法的原型其实是不同的。,引用转型,基类的引用可以指向派生类的对象,如: BaseClass obj = new DerivedC

6、lass(); 这样的语句是合法的; 但是派生类的引用则不可以指向基类的对象,如: DerivedClass obj = new BaseClass(); 这样的语句将引发错误。,引用转型示例,class Person /定义人类 class Student extends Person /学生类继承于人类 public class OverriddenDemo public static void main(String args) /正确,所有的学生一定是人 Person per = new Student(); /错误,并不是所有的人都是学生 Student std = new Pers

7、on(); ,问题,既然基类的引用可以指向派生类的实例,如果基类和派生类中存在方法覆盖的情况,那么通过基类的引用将会调用到哪个类中的方法呢?,示例,class Shapes /基本形状类 public void draw() /绘图的方法 System.out.println(绘制了一个基本形状。); class Circle extends Shapes /圆形类继承于基本形状类 public void draw() /覆盖父类的绘图方法 System.out.println(绘制了一个圆形。); class Square extends Shapes /正方形类继承与基本形状类 publi

8、c void draw() /覆盖父类的绘图方法 System.out.println(绘制了一个正方形。); public class polymorphismDemo public static void main(String args) Shapes obj = new Shapes(); /父类的引用指向父类的实例 obj.draw(); /调用绘图方法 obj = new Circle(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 obj = new Square(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 ,多态,从上例中

9、可以看出,父类的引用指向哪个类的实例就调用哪个类中的方法; 同样是使用父类的引用,调用同一个名称的方法,却可以得到不同的调用结果,这就是Java中的多态,即:同一函数,多种形态; 实际上多态包括动态多态和静态多态。,静态多态,静态多态也称为编译时多态,即在编译时决定调用哪个方法; 静态多态一般是指方法重载; 只要构成了方法重载,就可以认为形成了静态多态的条件; 静态多态与是否发生继承没有必然联系。,动态多态,动态多态也称为运行时多态,即在运行时才能确定调用哪个方法; 形成动态多态必须具体以下条件: 必须要有继承的情况存在; 在继承中必须要有方法覆盖; 必须由基类的引用指向派生类的实例,并且通过

10、基类的引用调用被覆盖的方法; 由上述条件可以看出,继承是实现动态多态的首要前提。,抽象方法,在某些情况下,基类无法(或者没有必要)提供被覆盖方法的具体实现,那么就可以将此方法声明成抽象方法; 使用关键字abstract声明抽象方法,一般语法: 访问权限 abstract 返回值类型 方法名称(参数列表); 如: public abstract void draw();,抽象类,如果某个类中包含有抽象方法,那么该类就必须定义成抽象类; 定义抽象类同样使用关键字abstract,一般语法: 访问权限 abstract class 类名 成员列表 如: public abstract class S

11、hapes public abstract void draw(); ,抽象类的注意事项,抽象类不可以直接实例化,只可以用来继承; 抽象类的派生子类应该提供对其所有抽象方法的具体实现; 可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型; 如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化; 抽象类中也可以包含有非抽象的方法; 构造方法和静态方法不可以修饰为abstract。,修改前面的案例,abstract class Shapes /基本形状类,抽象类 public abstract void draw();

12、/绘图方法,抽象方法 class Circle extends Shapes /圆形类继承于基本形状类 public void draw() /实现抽象父类的抽象绘图方法 System.out.println(绘制了一个圆形。); class Square extends Shapes /正方形类继承与基本形状类 public void draw() /实现抽象父类的抽象绘图方法 System.out.println(绘制了一个正方形。); public class abstractDemo /该类用于容纳main方法 public static void main(String args)

13、Shapes obj; obj = new Circle(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 obj = new Square(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 ,接口,如果某个类中的所有方法都是抽象方法,那么可以考虑将该类定义为接口; 定义接口使用关键字interface,一般语法: 访问权限 interface 接口名 成员列表 如: public interface IMyInterface ,实现接口,与抽象类相似,接口同样不可以实例化,只能用于实现; 如果某类要实现接口,则使用implements关键字,一

14、般语法: 访问权限 class 类名 implements 接口名 成员列表 如: public class MyClass implements IMyInterface ,接口示例,接口的注意事项,接口中不能定义非抽象方法,也就是说接口中不能包含有函数实体; 接口中的所有方法都默认为抽象方法,无需在每个方法前加abstract关键字; 接口的实现类应该提供对接口中所有抽象方法的具体实现,否则将成为抽象类; 与抽象类和它的继承类相似,也可以使用接口的引用指向其实现类的对象,从而达到动态多态的效果。,接口示例(续),/*InterfaceDemo.java源文件*/ /导入必要的接口和类 im

15、port aaa.IMyInterface; import bbb.MyClass; /用于容纳main方法 public class InterfaceDemo public static void main(String args) /使用接口的引用指向实现类的实例 IMyInterface obj = new MyClass(); System.out.println(两数的和是: + obj.add(20, 30); System.out.println(两数的差是: + obj.sub(30, 20); ,关于接口的更多知识,Java只支持单继承,而不能象C+那样可以多重继承,接口正

16、是为了弥补这一点; 某个类只能继承于一个父类,但可以实现多个接口,如: public class 实现类名 implements 接口1, 接口2, , 接口n 成员列表 ,关于接口的更多知识(续),Java中还允许一个接口继承于另一个接口,即由父接口派生出子接口,如: public interface 子接口名 extends 父接口名 成员列表 这样的话,甚至可以使用父接口的引用指向子接口的实现类的对象。,final关键字,在Java中,final关键字有最终的,不可修改的含义; final关键字有三种用途,可以分别应用于变量、成员方法和类。,final修饰变量,如果将某个变量修饰为final,那么该变量就成为常量,一般语法: 访问

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号