1、第8章 动物类派生 继承与多态,能力目标: 理解类的继承,能编写类及其派生子类。 理解多态含义,理解上转型对象,能在子类中重写父类的同名方法。 能运用继承与多态编写人类派生学生类、动物类派生马类等程序。,内容介绍,8.1 任务预览 8.2 继承与派生 8.3 用protected声明受保护成员 8.4 关键字super 8.5 类类型变量赋值 8.6 多态性 8.7 本章小结 8.8 实训8:人类派生与动物类派生,8.1 任务预览,本章实训程序运行结果:,8.2 继承与派生,计算机世界与自然界一样,类之间也有继承和派生关系。 运用继承与派生能达到代码重用、简化编程的目的。语法: public
2、abstract final class 子类名 extends 父类 . 类的单一继承关系形成了清晰的层次结构,树状图如下:,【例8-1】编写人类。再编写继承人类的学生类,学生类还拥有学号字段和学习方法。构造人类和学生类的对象,输出有关信息。,class Human1 /人类protected String name; protected char sex; protected int age; public Human1(String name, char sex, int age)this.name = name; this.sex = sex; this.age = age;publi
3、c void think() /思考方法System.out.println(name + “在思考.“); ,class Pupil1 extends Human1 /继承人类的学生类protected String stuNo; /学号public Pupil1(String stuNo, String name, char sex, int age) super(name, sex, age); this.stuNo = stuNo;public void learn( ) /学习方法 ,public class Example1 public static void main(Stri
4、ng args) Human1 person = new Human1(“林冲“, 男, 30);person.think(); System.out.println();Pupil1 aPupil = new Pupil1(“001“, “李明“, 男, 6);aPupil.think(); aPupil.learn(); ,8.3 用protected声明受保护成员,关键字protected可修饰类的字段和方法,这些成员能被所有派生子类直接或间接继承。 protected修饰的类成员,还能被类所在的包访问。 在例8-1中,使用了关键字protected修饰人类Human1的name、sex
5、和age字段。 虽然protected可以修饰字段,但类的封装性要求除了final常量字段外,其它字段一律应为private。故不可滥用protected修饰字段。,【例8-2】按照类封装性要求改写例8-1,以保证字段为private。,class Human2 private String name; private char sex; private int age;public Human2(String name, char sex, int age) protected String getName() public void think() ,class Pupil2 extend
6、s Human2 private String stuNo; public Pupil2() public void learn( ) public class Example2 public static void main(String args)Human2 person = new Human2(“林冲“, 男, 30);person.think(); Pupil2 aPupil = new Pupil2(“001“, “李明“, 男, 6);aPupil.think(); aPupil.learn(); ,8.4 关键字super 8.4.1 用super调用父类构造方法,类如果没有
7、显式声明构造方法,则自动生成无参数的默认构造方法。子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。【例8-3】编程,验证执行子类构造方法会自动调用父类的构造方法。 class Human3public Human3() System.out.println(“构造了一个人“); ,class Pupil3 extends Human3 public Pupil3()/super(); /相当于执行了本语句System.out.println(“构造了一个学生“); pu
8、blic class Example3 public static void main(String args) Pupil3 pupil = new Pupil3(); Student,8.4.2 用super访问父类字段和方法,除了调用父类构造方法外,super还可在子类中指代父类对象,用于: 访问被子类隐藏的父类字段, 调用被子类覆盖的父类方法。 使用形式:super.父类字段名super.父类方法名(可选实参表),1、成员的隐藏,对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量;子类自己声明定义的方法与父类方法同名是指子类重
9、新声明定义的这个成员方法。,2、子类通过重写可以隐藏已继承的实例方法。 1重写的语法规则如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。 2重写的目的子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。Bank,8.5 类类型变量赋值 8.5.1 子类对象的上转型对象,子类由父类派生,可把子类对象赋给父类声明的变量。如:Human human = new Pupil
10、(); 或者:Human human; Pupil pupil = new Pupil();human = pupil;,这种由父类变量引用的子类对象就是上转型对象。特征: (1)上转型对象不能操作子类新增的成员字段和成员方法。 (2)上转型对象能使用父类被继承或重写的成员方法、被继承或隐藏的成员变量。 (3)如果子类重写了父类的方法,则上转型对象调用该方法时一定是重写后的方法(多态性)。 (4)如果子类重新定义了父类的同名字段,即隐藏了父类的字段,则上转型对象访问该字段时必定是父类本身的字段。,【例8-4】编程,测试子类对象的上转型对象以及还原后的子类对象。,例8-4,8.5.2 子类变量不
11、能引用父类对象,父类对象没有下转型对象。 父类对象不能直接赋值给子类变量,子类变量不能直接引用父类对象。 如果一定要引用,则必须使用强制类型转换,语法: (类型名) 变量 比如:Pupil4 pupil = (Pupil4)human; 注意:并不是所有强制类型转换都能成功,例如:把马类的动物强制转换为鸟,就无法转换。无法转换时会引发异常。,8.5.3 兄弟类对象不能相互替换,如果鸟类、马类和鱼类都继承动物类,则它们是同一层次的,是兄弟(姐妹)类。 显然,鸟不是马,鸟也不是鱼,因此,不能把鸟对象赋给马类或鱼类声明的变量。 同一层次的兄弟类变量之间不能相互赋值,即兄弟类对象间不能相互替换。,8.
12、6 多态性,类的多态性: 一是类本身, 二是作为父类专用于派生, 三是通过实现接口而充当接口的实例类型。多态主要反映在方法重写(覆盖)和方法重载这两个方面。,8.6.1 方法重写,【例8-5】编程,测试方法重写方面的多态性。 class Mammal /哺乳动物类public void Shout() /呼叫方法System.out.println(“不同类的动物叫声不同“); class Cat extends Mammal /继承哺乳动物类的猫类public void Shout() /重写呼叫方法System.out.println(“猫的叫声:喵.喵.“); class Dog ext
13、ends Mammal /继承哺乳动物类的狗类public void Shout() /重写呼叫方法System.out.println(“狗的叫声:汪.汪.“);,class Tiger extends Mammal /继承哺乳动物类的虎类public void Shout() /重写呼叫方法System.out.println(“虎的叫声:吼.吼.“); public class Example5 public static void main(String args)Mammal animal;animal = new Cat();animal.Shout();animal = new
14、Dog();animal.Shout();animal = new Tiger();animal.Shout(); ,8.6.2 方法重载,方法重载:在一个类中定义多个同名但签名不同的方法。 例如两数相加方法add(a, b),参数类型组合有4种(多态):整整、整实、实整、实实,因此可定义4个同名但参数类型不同的方法(详见第3章3.5节“方法签名与方法重载”的例3-2)。,8.7 本章小结,类的继承与派生是一对互逆关系。 类是单一继承的,最顶层是根类Object。 protected主要作用是声明能被所有派生子类继承的成员。 关键字super与超(父)类相关,可以调用超类构造方法,也可访问被子
15、类隐藏的父类字段,或调用重写的父类方法。 把子类对象赋给父类声明的变量,就变成了上转型对象。 但子类变量不能引用父类对象,兄弟类对象也不能相互替换。 关于多态性,主要表现在方法重写和方法重载上。前者涉及到两个类,属于运行时多态,也叫动态多态性。而方法重载则是在一个类内部,属于编译时多态,也叫静态多态性。它们的共同点是方法名相同。,8.8 实训8:人类派生与动物类派生,(1)编程,编写人类Human,有私有的姓名、性别和年龄字段,定义获取各个私有字段的受保护方法,再定义公共的构造方法和思考方法。编写继承人类的学生类Pupil,有私有的学号字段以及获取该字段的受保护方法,还有公共的构造方法和学习方
16、法。再编写继承学生类的大学生类Student,有公共的构造方法、自学方法和输出数据方法。最后设计一个入口主类,构造若干个大学生,把他们的数据和行为列举出来。,(2)编程,测试多态:先编写动物类Animal,成员有:类名常量字段,私有的消息字段,公共的构造方法,公共的获取和设置消息方法、呼吸方法和行走方法。再分别编写继承动物类的鸟类Bird、马类Horse和鱼类Fish,均重新定义类名常量字段以隐藏继承的字段,重写父类的行走方法。最后编写一个入口主类,依次构造Animal类的各个上转型对象,调用其行走等方法,看是否会得到不同的结果。,作业:,定义一个图形父类,包含求面积的方法,扩展子类圆、矩形、三角形等类,分别求面积。,谢谢! 返回目录 结束放映,