《第4章继承和多态.ppt》由会员分享,可在线阅读,更多相关《第4章继承和多态.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象的程序设计第第 4 章章 继承和多态继承和多态雷擎雷擎对外经济贸易大学信息学院对外经济贸易大学信息学院面向对象的程序设计对外经济贸易大学 雷擎content4.1 什么是继承什么是继承4.2 抽象类与抽象方法抽象类与抽象方法4.3 接口接口4.4 多态性多态性实验:继承与多态实验:继承与多态面向对象的程序设计对外经济贸易大学 雷擎4.1 什么是继承什么是继承o 由已有的类创建新类由已有的类创建新类n 是面向对象程序设计的基石之一是面向对象程序设计的基石之一o 新类拥有新类拥有 所继承的已有类的功能所继承的已有类的功能o 子类是父类的特殊化子类是父类的特殊化o 继承机制可以提高程序的抽象
2、程度,提高代继承机制可以提高程序的抽象程度,提高代码的可重用性码的可重用性面向对象的程序设计对外经济贸易大学 雷擎继承的概念继承的概念o 基类基类(base class)n 也称超类也称超类(superclass)n 是已有的类,被直接或间接继承是已有的类,被直接或间接继承o 派生类派生类(derived-class)n 也称子类也称子类 (subclass)n 是新类,继承已有类后得到的类是新类,继承已有类后得到的类面向对象的程序设计对外经济贸易大学 雷擎继承的概念继承的概念o 继承的概念继承的概念n 父类(超类、基类):描述具有某些共同个性父类(超类、基类):描述具有某些共同个性的类。的类
3、。n 子类(派生类):在父类的基础上,对其中某子类(派生类):在父类的基础上,对其中某一部分对象的特殊共性进一步描述,则得到此一部分对象的特殊共性进一步描述,则得到此父类的子类(派生类)。父类的子类(派生类)。n 子类的对象拥有其父类全部或部分属性与方法子类的对象拥有其父类全部或部分属性与方法的定义过程,称为子类对父类的继承。的定义过程,称为子类对父类的继承。面向对象的程序设计对外经济贸易大学 雷擎is_a关系关系o 子类对象与父类对象的关系子类对象与父类对象的关系n 存在存在“IS A”(或或“is kind of”)的关系的关系undergraduatestudent面向对象的程序设计对外
4、经济贸易大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎继承的特点继承的特点o 类的继承允许多层的继承关系,也就是子类类的继承允许多层的继承关系,也就是子类可以有它自己的子类。可以有它自己的子类。o Java所有的类都直接或间接继承于所有的类都直接或间接继承于Object类,所有类类型都可以当做类,所有类类型都可以当做Object类型使类型使用。用。o Java的继承层次是无限的。的继承层次是无限的。面向对象的程序设计对外经济贸易大学 雷擎4.1 什么是继承什么是继承o 4.1.1 继承的语法继承的语法o 4.1.2 成员的继承成员的继承o 4.1.3 覆盖和隐藏覆盖和隐藏o 4.1.4 t
5、his和和super的用法的用法o 4.1.5 final的意义的意义面向对象的程序设计对外经济贸易大学 雷擎4.1.1 继承的语法继承的语法public class子类名子类名 extends 父类名父类名 /子类自身子类自身构造方法的定义构造方法的定义 /子类自身成员属性的定义子类自身成员属性的定义 /子类自身成员方法的定义子类自身成员方法的定义 .o Java只能做单继承只能做单继承面向对象的程序设计对外经济贸易大学 雷擎例:继承的语法例:继承的语法class Person private String id;private String name = 宝宝宝宝;private bool
6、ean gender;private Date birthday;/private final Date birthday;public 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 ex
7、tends Person int stuId;String name;Date enrolDate;public Student()public Student(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(i
8、d, name);面向对象的程序设计对外经济贸易大学 雷擎4.1.2 成员的继承成员的继承o 子类可以继承父类的属性,初始值为父类中子类可以继承父类的属性,初始值为父类中该属性的初值该属性的初值o 子类不能直接访问父类中非子类不能直接访问父类中非private的属性的属性,但可以通过调用父类的,但可以通过调用父类的public方法访问方法访问private属性。属性。o 子类可以继承父类的成员方法,但无法直接子类可以继承父类的成员方法,但无法直接访问父类的访问父类的private方法。方法。面向对象的程序设计对外经济贸易大学 雷擎子类对父类成员属性和方法的继承子类对父类成员属性和方法的继承o
9、子类和父类在同一包中子类和父类在同一包中n 子类可以访问父类中不是子类可以访问父类中不是private的成员变量的成员变量和方法和方法o 子类和父类在不同包中子类和父类在不同包中n 子类可以访问父类中子类可以访问父类中public和和protected成员成员变量和方法,不能访问默认和变量和方法,不能访问默认和private的成员的成员变量和方法变量和方法面向对象的程序设计对外经济贸易大学 雷擎例:子类对父类的继承例:子类对父类的继承class ParentClass private int x; / 声明私有成员声明私有成员protected int y;/ 声明保护成员声明保护成员int
10、z;/ 声明缺省成员声明缺省成员public int w; / 声明公有成员声明公有成员 public void parentmethod() System.out.println(call parent class function: parentmethod();面向对象的程序设计对外经济贸易大学 雷擎class SonClass extends ParentClass / 派生类中不能继承父类中的私有成员,其他成员均可继承派生类中不能继承父类中的私有成员,其他成员均可继承public void displayprivate() / 引用父类中私有成员引用父类中私有成员/ System.o
11、ut.println(X=+x); public void displayprotected() / 引用父类中保护成员引用父类中保护成员System.out.println(Y= + y); public void displaypublic() / 引用父类中公有成员引用父类中公有成员System.out.println(W= + w); public void displaydefault() / 引用父类中的默认成员引用父类中的默认成员System.out.println(Z= + z); ; 面向对象的程序设计对外经济贸易大学 雷擎class SonClass1 extends Pa
12、rentClass ;public class Test4_1 public static void main(String args) ParentClass parent = new ParentClass();SonClass son = new SonClass();SonClass1 son1 = new SonClass1();/ 三句执行的效果一样,三句执行的效果一样,son、son1中没有自己定义中没有自己定义parentmethod()方法,它继承了父类中的方法,它继承了父类中的parent.parentmethod();son.parentmethod();son1.par
13、entmethod(); 面向对象的程序设计对外经济贸易大学 雷擎构造方法的继承构造方法的继承o 有继承时的构造方法遵循以下的原则有继承时的构造方法遵循以下的原则n 子类不能从父类继承构造方法子类不能从父类继承构造方法n 好的程序设计方法是在子类的构造方法中调用好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用类构造方法的第一行,可使用super关键字关键字n 如子类构造方法的声明中没有明确调用父类构如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自造方法,则系统在执行
14、子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方动调用父类的默认构造方法(即无参的构造方法)法)面向对象的程序设计对外经济贸易大学 雷擎构造方法的继承构造方法的继承o 子类的构造方法会子类的构造方法会自动调用父类自动调用父类的无参构造的无参构造方法。方法。o 带参数的构造方法带参数的构造方法不会不会被子类继承,也不会被子类继承,也不会自动调用。在子类中,对父类有参构造方法自动调用。在子类中,对父类有参构造方法可以使用可以使用super显示调用显示调用面向对象的程序设计对外经济贸易大学 雷擎初始化初始化o 回顾:类的构造方法回顾:类的构造方法Case Study:Undergradu
15、ate.javao 在构造方法内调用构造方法:在构造方法内调用构造方法:this 的使用的使用n 可以用可以用this在一个构造方法内调用另一个构造在一个构造方法内调用另一个构造方法,但不可调用两个;方法,但不可调用两个;n 若有构造方法调用,必须是第一步。若有构造方法调用,必须是第一步。面向对象的程序设计对外经济贸易大学 雷擎父类与子类传递构造函数父类与子类传递构造函数o 缺省构造函数缺省构造函数Case Study: Catoon.javao 传递参数:传递参数:super()Case Study: AboutSubClassConstructor面向对象的程序设计对外经济贸易大学 雷擎4
16、.1.3 覆盖和隐藏覆盖和隐藏o 子类只能继承父类中子类只能继承父类中n 访问控制权限为访问控制权限为public、protected和和default的成员变量和方法的成员变量和方法o 子类不能继承子类不能继承n 访问权限为访问权限为private的成员变量和方法的成员变量和方法o 子类不能继承父类中的静态属性,但可以通子类不能继承父类中的静态属性,但可以通过过super进行操作进行操作面向对象的程序设计对外经济贸易大学 雷擎方法的覆盖方法的覆盖o 成员方法的覆盖成员方法的覆盖n 当子类中定义了与父类当子类中定义了与父类同名、同参数和同返回同名、同参数和同返回值类型值类型的成员方法,则父类的
17、成员方法被重写的成员方法,则父类的成员方法被重写,子类的方法,子类的方法覆盖覆盖了父类中的方法,称为方法了父类中的方法,称为方法的隐藏的隐藏n 方法重写,是运行时多态的基础方法重写,是运行时多态的基础o 在子类中调用同名的方法时,是调用它自己在子类中调用同名的方法时,是调用它自己定义的方法;若要使用父类中被覆盖的方法定义的方法;若要使用父类中被覆盖的方法,可以使用,可以使用super关键字。关键字。面向对象的程序设计对外经济贸易大学 雷擎例:方法的覆盖例:方法的覆盖public class SuperClass void print() System.out.println(This is t
18、he 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!);面向对象的程序设计对外经济贸易大学 雷擎成员变量的隐藏成员变量的隐藏o 成员变量的隐藏成员变量的隐藏n 当子类中定义了与父类同名的成员变量,
19、则父当子类中定义了与父类同名的成员变量,则父类的成员变量被隐藏类的成员变量被隐藏n 在子类执行从父类继承的方法时,使用在子类执行从父类继承的方法时,使用this可可以访问本类中的实例变量,关键字以访问本类中的实例变量,关键字super可以可以访问被隐藏的父类实例变量。访问被隐藏的父类实例变量。面向对象的程序设计对外经济贸易大学 雷擎4.1.4 this和和super的用法的用法o this: 指当前对象,其调用格式为:指当前对象,其调用格式为:n this.成员变量成员变量n this.成员方法成员方法n this( parameters list)o super:指父类对象,其调用格式为:指
20、父类对象,其调用格式为:n super.成员变量成员变量n super.成员方法成员方法n super( parameters list)面向对象的程序设计对外经济贸易大学 雷擎this的用法的用法o 1 返回当前对象的引用返回当前对象的引用o 2 在实例变量和局部变量同名的时候访问当在实例变量和局部变量同名的时候访问当前对象的实例变量前对象的实例变量o 3 在类的构造方法中调用这个类的其他的构在类的构造方法中调用这个类的其他的构造方法造方法o 4 不能在静态方法或静态代码块中使用不能在静态方法或静态代码块中使用this面向对象的程序设计对外经济贸易大学 雷擎例:例:this的用法的用法pub
21、lic 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.print();System.out.pr
22、intln(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,因为,因为没有会导致混淆的东西没有会导致混
23、淆的东西面向对象的程序设计对外经济贸易大学 雷擎super的用法的用法o 1 调用被子类隐藏的父类的实例变量调用被子类隐藏的父类的实例变量 o 2 调用父类的方法调用父类的方法o 3 在子类里面调用父类的构造方法在子类里面调用父类的构造方法 如果不如果不显示的调用则默认的调用父类无参的构造方显示的调用则默认的调用父类无参的构造方法如果父类没有无参的构造方法这程序报错法如果父类没有无参的构造方法这程序报错o 4 父类中定义为父类中定义为private的变量和方法,的变量和方法,子类不能继承,使用子类不能继承,使用super也无法访问。也无法访问。面向对象的程序设计对外经济贸易大学 雷擎例:例:s
24、uper的用法的用法public class PersonB extends PersonApublic void print() System.out.println(DemoSuper:);super.print();public static void main(String args) PersonB b = new PersonB();b.print();面向对象的程序设计对外经济贸易大学 雷擎public class PersonC extends PersonApublic PersonC()/super();public PersonC(String name, int age
25、)super(name,age);public static void main(String args) new PersonC();new PersonC(Mary,3);面向对象的程序设计对外经济贸易大学 雷擎4.1.5 final的意义的意义o final修饰的含义:无法改变、或终态的修饰的含义:无法改变、或终态的o final的用法的用法n final变量:表明该成员变量为常量表明该成员变量为常量n 内部类使用内部类使用final:n final方法方法:表明该成员方法不能被重写表明该成员方法不能被重写n final类类:表明该类不能够被继承表明该类不能够被继承面向对象的程序设计对外
26、经济贸易大学 雷擎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 cla
27、ss Test4_15 public static void 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.
28、println(str + n + str1);面向对象的程序设计对外经济贸易大学 雷擎4.2 抽象类与抽象方法抽象类与抽象方法o “万物皆对象万物皆对象”,java中所有的对象都是通中所有的对象都是通过类来描绘过类来描绘 。o 所有的类都是用来描绘对象的吗?所有的类都是用来描绘对象的吗?o 如果一个类中没有包含足够的信息来描绘一如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是个具体的对象,这样的类就是抽象类抽象类。 面向对象的程序设计对外经济贸易大学 雷擎抽象类的基本概念抽象类的基本概念o抽象类抽象类是表征我们对问题领域进行分析、设是表征我们对问题领域进行分析、设计中得出的计
29、中得出的抽象概念抽象概念,是对一系列看上去不,是对一系列看上去不同,但是本质上相同的具体概念的抽象。同,但是本质上相同的具体概念的抽象。o 例如:例如: “东西东西” 与与“物体物体” ?o 我们要描述这个概念就要用到抽象类。因此我们要描述这个概念就要用到抽象类。因此在在java中抽象类是不允许被实例化的。中抽象类是不允许被实例化的。 面向对象的程序设计对外经济贸易大学 雷擎抽象类的用途抽象类的用途o 抽象类通常代表一个抽象概念,可以用一句抽象类通常代表一个抽象概念,可以用一句话来概括抽象类的用途:抽象类是用来继承话来概括抽象类的用途:抽象类是用来继承的。的。o 反过来可以说具体类不是用来继承
30、的,只要反过来可以说具体类不是用来继承的,只要有可能,我们不要从具体类继承。有可能,我们不要从具体类继承。面向对象的程序设计对外经济贸易大学 雷擎抽象类和抽象方法抽象类和抽象方法abstract class classname /Class bodypublic abstract methodname();面向对象的程序设计对外经济贸易大学 雷擎抽象类和抽象方法抽象类和抽象方法o 一个类的作用仅仅是表达通用接口,而不是具一个类的作用仅仅是表达通用接口,而不是具体的实现细节体的实现细节o 抽象方法是不完全的,是有一个声明没有方法抽象方法是不完全的,是有一个声明没有方法主体主体o 包含一个抽象方法
31、的类被称为抽象类包含一个抽象方法的类被称为抽象类o 不能创建抽象类的对象不能创建抽象类的对象o 从抽象类继承的类必须从抽象类继承的类必须override所有的抽象所有的抽象方法,否则它自己成为抽象类。方法,否则它自己成为抽象类。o 可以申明一个抽象类,但里面没有一个抽象方可以申明一个抽象类,但里面没有一个抽象方法法面向对象的程序设计对外经济贸易大学 雷擎4.3 接口接口o 4.3.1 接口的作用接口的作用o 4.3.2 语法格式语法格式o 4.3.3 接口的实现接口的实现o 4.3.4 适配器适配器面向对象的程序设计对外经济贸易大学 雷擎4.3.1 接口的作用接口的作用o 是面向对象语言提供的
32、抽象是面向对象语言提供的抽象和封装和封装重要机制重要机制,是抽象的进一步深化。,是抽象的进一步深化。o 把不同类的共同特征抽象出来,归于不同的把不同类的共同特征抽象出来,归于不同的接口,可以更好的管理他们。接口,可以更好的管理他们。o 接口允许设计者规定一个类的基本形式:接口允许设计者规定一个类的基本形式:方方法和属性列表,但不给出实现法和属性列表,但不给出实现。 面向对象的程序设计对外经济贸易大学 雷擎o 接口可以实现多重继承功能。接口可以实现多重继承功能。 o 没有继承关系的类之间也会存在相同的属性没有继承关系的类之间也会存在相同的属性和方法,可以将这些属性和方法组织成接口和方法,可以将这
33、些属性和方法组织成接口,需要这些属性和方法的类可以实现这个接,需要这些属性和方法的类可以实现这个接口。口。4.3.1 接口的作用接口的作用面向对象的程序设计对外经济贸易大学 雷擎4.3.2 语法格式语法格式o 声明格式:声明格式:interface interfacename /method & basic datan 接口的数据成员一定要赋初值,且此值将不能接口的数据成员一定要赋初值,且此值将不能再更改,允许省略再更改,允许省略final关键字关键字n 接口中的方法必须是接口中的方法必须是“抽象方法抽象方法”,不能有方,不能有方法体,允许省略法体,允许省略public及及abstract关键
34、字关键字面向对象的程序设计对外经济贸易大学 雷擎接口与抽象类的区别接口与抽象类的区别o 接口与抽象类也有些类似,有抽象的方法,接口与抽象类也有些类似,有抽象的方法,接口与抽象类的区别是:接口与抽象类的区别是:n (1)接口中不能有非抽象方法(抽象类可以有非接口中不能有非抽象方法(抽象类可以有非抽象方法);抽象方法);n (2)一个接口可以有多个父接口(抽象类只能由一个接口可以有多个父接口(抽象类只能由 一个父类);一个父类);n (3)接口中的属性的修饰符仅限于接口中的属性的修饰符仅限于public static final;n (4)接口不属于继承结构,它与实际继承关系无接口不属于继承结构,
35、它与实际继承关系无关,因此无关的类也可以实现同一个接口。关,因此无关的类也可以实现同一个接口。面向对象的程序设计对外经济贸易大学 雷擎4.3.3 接口的实现接口的实现o 由于接口中的方法都是抽象方法,所以接口由于接口中的方法都是抽象方法,所以接口定义完成之后,必须在各类中对这个接口的定义完成之后,必须在各类中对这个接口的方法进行具体化,就是在这个类中重新定义方法进行具体化,就是在这个类中重新定义接口的所有方法,这时这些方法就不能是抽接口的所有方法,这时这些方法就不能是抽象的了,我们称这个过程为某各类实现了某象的了,我们称这个过程为某各类实现了某个接口。个接口。面向对象的程序设计对外经济贸易大学
36、 雷擎实现接口应注意实现接口应注意o 一个类能够实现多个接口,一个接口可以被一个类能够实现多个接口,一个接口可以被多个类实现。多个类实现。o 一个类实现接口必须实现这个接口中的所有一个类实现接口必须实现这个接口中的所有方法,包括父接口中的方法。被实现的方法方法,包括父接口中的方法。被实现的方法必须和接口定义的方法有完全一样的方法名必须和接口定义的方法有完全一样的方法名、返回值和形参表(否则就是重载)。、返回值和形参表(否则就是重载)。o 被实现的方法的访问控制类型必须是被实现的方法的访问控制类型必须是public。面向对象的程序设计对外经济贸易大学 雷擎实现接口实现接口class classn
37、ame implements interfacename /class body including method body面向对象的程序设计对外经济贸易大学 雷擎接口的多重继承接口的多重继承o Interface可以从多个可以从多个interface得到继承,得到继承,但不能继承类。但不能继承类。interface interfacename extends if1, if2,/method & basic data面向对象的程序设计对外经济贸易大学 雷擎类的多个接口实现类的多个接口实现o 一个类可以实现多个一个类可以实现多个interface.class classname impleme
38、nts if1, if2, /class body including method body面向对象的程序设计对外经济贸易大学 雷擎4.3.4 适配器适配器o 使用一个接口时必须实现所有的方法,通常使用一个接口时必须实现所有的方法,通常我们只需要使用接口中某些方法,如果也全我们只需要使用接口中某些方法,如果也全部实现其他抽象方法非常不方便。在部实现其他抽象方法非常不方便。在Java中,中,Java类库为所有类库为所有 接口提供了一个与接接口提供了一个与接口相对应的抽象类(这个抽象类定义的内容口相对应的抽象类(这个抽象类定义的内容与接口相同,只是一个是接口一个是抽象类与接口相同,只是一个是接口
39、一个是抽象类),当我们只需要使用某个接口的少部分方),当我们只需要使用某个接口的少部分方法时,就可以法时,就可以 继承与之相对应的抽象类,继承与之相对应的抽象类,这个抽象类成为这个接口的适配器。这个抽象类成为这个接口的适配器。面向对象的程序设计对外经济贸易大学 雷擎4.4 多态性多态性o 4.4.1 后期绑定后期绑定o 4.4.2 上溯造型上溯造型o 4.4.3 下塑造型下塑造型o 4.4.4 重载重载面向对象的程序设计对外经济贸易大学 雷擎4.4.1 后期绑定后期绑定o 将一个方法调用和一个方法主体连接到一起将一个方法调用和一个方法主体连接到一起称为绑定(称为绑定(Binding)。)。o
40、根据绑定的时机不同,可将绑定分为根据绑定的时机不同,可将绑定分为“早期早期绑定绑定”和和“后期绑定后期绑定”两种。两种。n 早期绑定早期绑定:如果在程序运行之前进行绑定(由如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。编译器和链接程序完成),称为早期绑定。n 后期绑定后期绑定:如果在程序运行期间进行绑定,称如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为为后期绑定,后期绑定也称为“动态绑定动态绑定”或或“运行时绑定运行时绑定”。面向对象的程序设计对外经济贸易大学 雷擎4.4.1 后期绑定后期绑定o 在在Java中,多态性是依靠后期绑定实现的中,多态性是依靠后期绑定
41、实现的,即,即Java虚拟机在运行时确定要调用哪一虚拟机在运行时确定要调用哪一个同名方法,除非一个方法已被声明成个同名方法,除非一个方法已被声明成final。面向对象的程序设计对外经济贸易大学 雷擎4.4.2 上溯造型上溯造型o 将一个对象作为它自己的类型使用,或者作将一个对象作为它自己的类型使用,或者作为它的基础类型的一个对象使用。为它的基础类型的一个对象使用。o 由于造型的方向是从衍生类到基础类,箭头由于造型的方向是从衍生类到基础类,箭头朝上,所以通常把它叫作朝上,所以通常把它叫作“上溯造型上溯造型”,即,即Upcasting。面向对象的程序设计对外经济贸易大学 雷擎经典的例子经典的例子面
42、向对象的程序设计对外经济贸易大学 雷擎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() System.out.println(Square.draw();void erase() System.out.println(S
43、quare.erase();class Triangle extends Shape .面向对象的程序设计对外经济贸易大学 雷擎class Shapes public static Shape randShape() switch (int) (Math.random() * 3) default: / To quiet the compilercase 0:return new Circle();case 1:return new Square();case 2:return new Triangle();面向对象的程序设计对外经济贸易大学 雷擎public class Test4_18 p
44、ublic 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.3 下塑造型下塑造型面向对象的程序设计对外经济贸易大学 雷擎class Useful public void f()
45、 public void g() 面向对象的程序设计对外经济贸易大学 雷擎class MoreUseful extends Useful public void f() public void g() public void u() public void v() public void w() 面向对象的程序设计对外经济贸易大学 雷擎public class Test4_19 public static void main(String args) Useful x = new Useful(), new MoreUseful() ;x0.f();x1.g(); / Compile-time
46、: method not found in Useful:/ ! x1.u();(MoreUseful) x1).u(); / Downcast/RTTI(MoreUseful) x0).u(); / Exception thrown面向对象的程序设计对外经济贸易大学 雷擎4.4.4 重载重载o 重载(指方法重载)是指在一个类中定义了重载(指方法重载)是指在一个类中定义了多个同名的方法,但各个方法的参数个数和多个同名的方法,但各个方法的参数个数和参数类型不同,根据不同的参数个数和类型参数类型不同,根据不同的参数个数和类型来选择执行不同的方法,修饰符和返回值也来选择执行不同的方法,修饰符和返回值
47、也可以不同。可以不同。o 方法重载的条件:方法重载的条件:n 方法名相同方法名相同n 参数列表不同,其中包括:参数的个数不同、参数列表不同,其中包括:参数的个数不同、参数的类型不同、参数类型的顺序不同参数的类型不同、参数类型的顺序不同面向对象的程序设计对外经济贸易大学 雷擎构造方法重载构造方法重载o 构造方法重载的目的构造方法重载的目的n 以不同的方法对类进行初始化。以不同的方法对类进行初始化。n 构造方法的重载与其它方法相同,根据参数列构造方法的重载与其它方法相同,根据参数列表调用相同的构造方法。表调用相同的构造方法。n 如果找不到相应的构造方法(包括兼容类型)如果找不到相应的构造方法(包括
48、兼容类型)则出错。则出错。面向对象的程序设计对外经济贸易大学 雷擎小结小结4.1 什么是继承什么是继承4.2 抽象类与抽象方法抽象类与抽象方法4.3 接口接口4.4 多态性多态性面向对象的程序设计对外经济贸易大学 雷擎实验:继承和多态实验:继承和多态o 实验实验6:继承:继承o 实验实验7:抽象类:抽象类o 实验实验8:多态:多态BACK面向对象的程序设计对外经济贸易大学 雷擎知识点提示:知识点提示:o 理解理解n 类继承的概念类继承的概念n 抽象类的概念抽象类的概念n 接口的概念和定义接口的概念和定义o 掌握继承掌握继承n 类继承的语法类继承的语法n 类的隐藏和覆盖,以及构造方法的调用类的隐藏和覆盖,以及构造方法的调用面向对象的程序设计对外经济贸易大学 雷擎知识点提示:知识点提示:o 掌握抽象类掌握抽象类n 抽象类的定义抽象类的定义o 掌握接口掌握接口n 接口的定义接口的定义n 接口的继承与多继承接口的继承与多继承n 接口的实现方法接口的实现方法n 多态的体现多态的体现面向对象的程序设计End of Chapter 4