第4章继承和多态.ppt

上传人:本田雅阁 文档编号:2577715 上传时间:2019-04-11 格式:PPT 页数:74 大小:324.51KB
返回 下载 相关 举报
第4章继承和多态.ppt_第1页
第1页 / 共74页
第4章继承和多态.ppt_第2页
第2页 / 共74页
第4章继承和多态.ppt_第3页
第3页 / 共74页
亲,该文档总共74页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第4章继承和多态.ppt》由会员分享,可在线阅读,更多相关《第4章继承和多态.ppt(74页珍藏版)》请在三一文库上搜索。

1、第 4 章 继承和多态,雷擎 对外经济贸易大学信息学院,content,4.1 什么是继承 4.2 抽象类与抽象方法 4.3 接口 4.4 多态性 实验:继承与多态,4.1 什么是继承,由已有的类创建新类 是面向对象程序设计的基石之一 新类拥有 所继承的已有类的功能 子类是父类的特殊化 继承机制可以提高程序的抽象程度,提高代码的可重用性,继承的概念,基类(base class) 也称超类(superclass) 是已有的类,被直接或间接继承 派生类(derived-class) 也称子类 (subclass) 是新类,继承已有类后得到的类,继承的概念,继承的概念 父类(超类、基类):描述具有

2、某些共同个性的类。 子类(派生类):在父类的基础上,对其中某一部分对象的特殊共性进一步描述,则得到此父类的子类(派生类)。 子类的对象拥有其父类全部或部分属性与方法的定义过程,称为子类对父类的继承。,is_a关系,子类对象与父类对象的关系 存在“IS A”(或“is kind of”)的关系,undergraduate,student,is kind of,继承的特点,类的继承允许多层的继承关系,也就是子类可以有它自己的子类。 Java所有的类都直接或间接继承于Object类,所有类类型都可以当做Object类型使用。 Java的继承层次是无限的。,4.1 什么是继承,4.1.1 继承的语法

3、4.1.2 成员的继承 4.1.3 覆盖和隐藏 4.1.4 this和super的用法 4.1.5 final的意义,4.1.1 继承的语法,public class子类名 extends 父类名 /子类自身构造方法的定义 /子类自身成员属性的定义 /子类自身成员方法的定义 . Java只能做单继承,例:继承的语法,class Person private String id; private String name = “宝宝“; private boolean gender; private Date birthday; /private final Date birthday; publ

4、ic Person () /have to set value to birthday /if delete this constructor, subclass have problems. public Person(String id, String name) this.id = id; this.name = name; this.gender = false; this.birthday = ,class Student extends Person int stuId; String name; Date enrolDate; public Student() public St

5、udent(String id, String name, Date date) super(id, name); ,public class Undergraduate extends Student String collegeName; String major; public Undergraduate() . public Undergraduate(String id, String name) super(id, name); ,4.1.2 成员的继承,子类可以继承父类的属性,初始值为父类中该属性的初值 子类不能直接访问父类中非private的属性,但可以通过调用父类的publi

6、c方法访问private属性。 子类可以继承父类的成员方法,但无法直接访问父类的private方法。,子类对父类成员属性和方法的继承,子类和父类在同一包中 子类可以访问父类中不是private的成员变量和方法 子类和父类在不同包中 子类可以访问父类中public和protected成员变量和方法,不能访问默认和private的成员变量和方法,例:子类对父类的继承,class ParentClass private int x; / 声明私有成员 protected int y;/ 声明保护成员 int z;/ 声明缺省成员 public int w; / 声明公有成员 public void

7、parentmethod() System.out.println(“call parent class function: parentmethod()“); ;,class SonClass extends ParentClass / 派生类中不能继承父类中的私有成员,其他成员均可继承 public void displayprivate() / 引用父类中私有成员 / System.out.println(“X=“+x); public void displayprotected() / 引用父类中保护成员 System.out.println(“Y=“ + y); public voi

8、d displaypublic() / 引用父类中公有成员 System.out.println(“W=“ + w); public void displaydefault() / 引用父类中的默认成员 System.out.println(“Z=“ + z); ;,class SonClass1 extends ParentClass ; public class Test4_1 public static void main(String args) ParentClass parent = new ParentClass(); SonClass son = new SonClass();

9、 SonClass1 son1 = new SonClass1(); / 三句执行的效果一样,son、son1中没有自己定义parentmethod()方法,它继承了父类中的 parent.parentmethod(); son.parentmethod(); son1.parentmethod(); ,构造方法的继承,有继承时的构造方法遵循以下的原则 子类不能从父类继承构造方法 好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字 如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的

10、默认构造方法(即无参的构造方法),构造方法的继承,子类的构造方法会自动调用父类的无参构造方法。 带参数的构造方法不会被子类继承,也不会自动调用。在子类中,对父类有参构造方法可以使用super显示调用,初始化,回顾:类的构造方法 Case Study:Undergraduate.java 在构造方法内调用构造方法:this 的使用 可以用this在一个构造方法内调用另一个构造方法,但不可调用两个; 若有构造方法调用,必须是第一步。,父类与子类传递构造函数,缺省构造函数 Case Study: Catoon.java 传递参数:super() Case Study: AboutSubClassCo

11、nstructor,4.1.3 覆盖和隐藏,子类只能继承父类中 访问控制权限为public、protected和default的成员变量和方法 子类不能继承 访问权限为private的成员变量和方法 子类不能继承父类中的静态属性,但可以通过super进行操作,方法的覆盖,成员方法的覆盖 当子类中定义了与父类同名、同参数和同返回值类型的成员方法,则父类的成员方法被重写,子类的方法覆盖了父类中的方法,称为方法的隐藏 方法重写,是运行时多态的基础 在子类中调用同名的方法时,是调用它自己定义的方法;若要使用父类中被覆盖的方法,可以使用super关键字。,例:方法的覆盖,public class Sup

12、erClass void print() System.out.println(“This is the superclass!“); public static void main(String args) SuperClass sup = new SuperClass(); sup.print(); SubClass sub = new SubClass(); sub.print(); class SubClass extends SuperClass void print() System.out.println(“This is the subclass!“); ;,成员变量的隐藏,成

13、员变量的隐藏 当子类中定义了与父类同名的成员变量,则父类的成员变量被隐藏 在子类执行从父类继承的方法时,使用this可以访问本类中的实例变量,关键字super可以访问被隐藏的父类实例变量。,4.1.4 this和super的用法,this: 指当前对象,其调用格式为: this.成员变量 this.成员方法 this( parameters list) super:指父类对象,其调用格式为: super.成员变量 super.成员方法 super( parameters list),this的用法,1 返回当前对象的引用 2 在实例变量和局部变量同名的时候访问当前对象的实例变量 3 在类的构造

14、方法中调用这个类的其他的构造方法 4 不能在静态方法或静态代码块中使用this,例:this的用法,public class PersonA private String name; private int age; PersonA() this(“No name“,0); System.out.println(“In PersonA constuctor“); ,PersonA(String name, int age) setName(name); / 你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的 this.setAge(age); this

15、.print(); System.out.println(“In PersonA constuctor with parameters“); ,public void setName(String name) this.name = name;/ 此处必须指明你要引用成员变量 public void setAge(int age) this.age = age; public void print() System.out.println(“Name=“ + name + “ Age=“ + age);/ 在此行中并不需要用this,因为没有会导致混淆的东西 ,super的用法,1 调用被子类

16、隐藏的父类的实例变量 2 调用父类的方法 3 在子类里面调用父类的构造方法 如果不显示的调用则默认的调用父类无参的构造方法如果父类没有无参的构造方法这程序报错 4 父类中定义为private的变量和方法,子类不能继承,使用super也无法访问。,例:super的用法,public class PersonB extends PersonA public void print() System.out.println(“DemoSuper:“); super.print(); public static void main(String args) PersonB b = new PersonB

17、(); b.print(); ,public class PersonC extends PersonA public PersonC() /super(); public PersonC(String name, int age) super(name,age); public static void main(String args) new PersonC(); new PersonC(“Mary“,3); ,4.1.5 final的意义,final修饰的含义:无法改变、或终态的 final的用法 final变量:表明该成员变量为常量 内部类使用final: final方法:表明该成员方

18、法不能被重写 final类:表明该类不能够被继承,public class Test4_13 final double PI = 3.14; / 在定义时便给址值 final int i; / 因为要在构造方法中进行初始化,所以此处便不可再给值 Test4_13() i = 100; list = new LinkedList(); Test4_13(int ii) i = ii; public static void main(String args) Test4_13 b = new Test4_13(); ,public class Test4_15 public static void

19、 main(String args) FinalClass f = new FinalClass(); f.what(); f.print(); ,final class FinalClass final String str = “final Data“; public String str1 = “non final data“; final public void print() System.out.println(“final method.“); public void what() System.out.println(str + “n“ + str1); ,4.2 抽象类与抽象

20、方法,“万物皆对象”,java中所有的对象都是通过类来描绘 。 所有的类都是用来描绘对象的吗? 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。,抽象类的基本概念,抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 例如: “东西” 与“物体” ? 我们要描述这个概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。,抽象类的用途,抽象类通常代表一个抽象概念,可以用一句话来概括抽象类的用途:抽象类是用来继承的。 反过来可以说具体类不是用来继承的,只要有可能,我们不要从具体类继承。,抽象类和抽象方法,a

21、bstract class classname /Class body public abstract methodname(); ,抽象类和抽象方法,一个类的作用仅仅是表达通用接口,而不是具体的实现细节 抽象方法是不完全的,是有一个声明没有方法主体 包含一个抽象方法的类被称为抽象类 不能创建抽象类的对象 从抽象类继承的类必须override所有的抽象方法,否则它自己成为抽象类。 可以申明一个抽象类,但里面没有一个抽象方法,4.3 接口,4.3.1 接口的作用 4.3.2 语法格式 4.3.3 接口的实现 4.3.4 适配器,4.3.1 接口的作用,是面向对象语言提供的抽象和封装重要机制,是抽

22、象的进一步深化。 把不同类的共同特征抽象出来,归于不同的接口,可以更好的管理他们。 接口允许设计者规定一个类的基本形式:方法和属性列表,但不给出实现。,接口可以实现多重继承功能。 没有继承关系的类之间也会存在相同的属性和方法,可以将这些属性和方法组织成接口,需要这些属性和方法的类可以实现这个接口。,4.3.1 接口的作用,4.3.2 语法格式,声明格式: interface interfacename /method & basic data 接口的数据成员一定要赋初值,且此值将不能再更改,允许省略final关键字 接口中的方法必须是“抽象方法”,不能有方法体,允许省略public及abstr

23、act关键字,接口与抽象类的区别,接口与抽象类也有些类似,有抽象的方法,接口与抽象类的区别是: (1)接口中不能有非抽象方法(抽象类可以有非抽象方法); (2)一个接口可以有多个父接口(抽象类只能由 一个父类); (3)接口中的属性的修饰符仅限于public static final; (4)接口不属于继承结构,它与实际继承关系无关,因此无关的类也可以实现同一个接口。,4.3.3 接口的实现,由于接口中的方法都是抽象方法,所以接口定义完成之后,必须在各类中对这个接口的方法进行具体化,就是在这个类中重新定义接口的所有方法,这时这些方法就不能是抽象的了,我们称这个过程为某各类实现了某个接口。,实现

24、接口应注意,一个类能够实现多个接口,一个接口可以被多个类实现。 一个类实现接口必须实现这个接口中的所有方法,包括父接口中的方法。被实现的方法必须和接口定义的方法有完全一样的方法名、返回值和形参表(否则就是重载)。 被实现的方法的访问控制类型必须是public。,实现接口,class classname implements interfacename /class body including method body ,接口的多重继承,Interface可以从多个interface得到继承,但不能继承类。 interface interfacename extends if1, if2, /m

25、ethod & basic data ,类的多个接口实现,一个类可以实现多个interface. class classname implements if1, if2, /class body including method body ,interface例子:,为什么要定义那么多接口然后再用类去一个个继承他们? 这里有一个游戏,人猿泰山。 主角是一个单独的类 这里我们主要用怪物说明接口的用法。怪物有很多种, 按地域分:有的在天上飞,有的在地上跑,有的在水里游 按攻击方式分:有的能近距离物理攻击,有的能远距离射击,假设游戏里需要这样的几种怪 狼:地上移动,近距离攻击 黑熊:地上移动,近/远

26、距离攻击 老鹰:地上/天上移动,远距离攻击 食人鱼:水中移动,近距离攻击 鳄鱼:地上/水中移动,近距离攻击,我们使用接口来实现各种怪物的定义: interface OnEarth/陆地接口 int earthSpeed; /陆地移动速度 void earthMove(); /陆地移动方法 interface NearAttack /近距离攻击接口 int nearAttackPower; /近距离攻击力 void nearAttack(); /近距离攻击方法 ,4.3.4 适配器,使用一个接口时必须实现所有的方法,通常我们只需要使用接口中某些方法,如果也全部实现其他抽象方法非常不方便。在Jav

27、a中,Java类库为所有 接口提供了一个与接口相对应的抽象类(这个抽象类定义的内容与接口相同,只是一个是接口一个是抽象类),当我们只需要使用某个接口的少部分方法时,就可以 继承与之相对应的抽象类,这个抽象类成为这个接口的适配器。,4.4 多态性,4.4.1 后期绑定 4.4.2 上溯造型 4.4.3 下塑造型 4.4.4 重载,4.4.1 后期绑定,将一个方法调用和一个方法主体连接到一起称为绑定(Binding)。 根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。如果在程序运行期间进行绑定,称为后期绑定,后期绑

28、定也称为“动态绑定”或“运行时绑定”。 在Java中,多态性是依靠后期绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法,除非一个方法已被声明成final。,4.4.1 后期绑定,根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。 早期绑定 如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。 后期绑定 如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为“动态绑定”或“运行时绑定”。,4.4.1 后期绑定,在Java中,多态性是依靠后期绑定实现的,即Java虚拟机在运行时确定要调用哪一个同名方法,除非一个方法已被声明成final。,4.4.2 上溯

29、造型,将一个对象作为它自己的类型使用,或者作为它的基础类型的一个对象使用。 由于造型的方向是从衍生类到基础类,箭头朝上,所以通常把它叫作“上溯造型”,即Upcasting。,经典的例子,class Shape void draw() void erase() class Circle extends Shape void draw() System.out.println(“Circle.draw()“); void erase() System.out.println(“Circle.erase()“); ,class Square extends Shape void draw() Sys

30、tem.out.println(“Square.draw()“); void erase() System.out.println(“Square.erase()“); class Triangle extends Shape ,class Shapes public static Shape randShape() switch (int) (Math.random() * 3) default: / To quiet the compiler case 0: return new Circle(); case 1: return new Square(); case 2: return n

31、ew Triangle(); ,public class Test4_18 public static void main(String args) Shape s = new Shape9; / Fill up the array with shapes: for (int i = 0; i s.length; i+) si = Shapes.randShape(); / Make polymorphic method calls: for (int i = 0; i s.length; i+) si.draw(); ,4.4.4 重载,重载(指方法重载)是指在一个类中定义了多个同名的方法,

32、但各个方法的参数个数和参数类型不同,根据不同的参数个数和类型来选择执行不同的方法,修饰符和返回值也可以不同。 方法重载的条件: 方法名相同 参数列表不同,其中包括:参数的个数不同、参数的类型不同、参数类型的顺序不同,构造方法重载,构造方法重载的目的 以不同的方法对类进行初始化。 构造方法的重载与其它方法相同,根据参数列表调用相同的构造方法。 如果找不到相应的构造方法(包括兼容类型)则出错。,小结,4.1 什么是继承 4.2 抽象类与抽象方法 4.3 接口 4.4 多态性,实验:继承和多态,实验6:继承 实验7:抽象类 实验8:多态,BACK,知识点提示:,理解 类继承的概念 抽象类的概念 接口的概念和定义 掌握继承 类继承的语法 类的隐藏和覆盖,以及构造方法的调用,知识点提示:,掌握抽象类 抽象类的定义 掌握接口 接口的定义 接口的继承与多继承 接口的实现方法 多态的体现,End of Chapter 3,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1