资源预览内容
第1页 / 共35页
第2页 / 共35页
第3页 / 共35页
第4页 / 共35页
第5页 / 共35页
第6页 / 共35页
第7页 / 共35页
第8页 / 共35页
第9页 / 共35页
第10页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
*第八章继承与多态计算机学院计算机学院 教学目标v理解类的继承,能编写类及其派生子类;v能在子类中重写父类的同名方法; v理解多态含义,理解上转型对象; v能运用继承与多态编写人类派生学生类、图形类的派生类求面积等任务*计算机学院 *Contents回顾类的定义1继承与派生2用protected声明受保护成员3关键字super4多态性5here计算机学院 *回顾v类的定义格式类的头部: class 类名 extends 父类类体成员变量实例变量类变量成员方法构造方法其他方法v类的使用构造对象 :对象=new 构造方法计算机学院 *Contents回顾类的定义1继承与派生2用protected声明受保护成员3关键字super4多态性5here计算机学院 *2、继承与派生v目的:继承与派生能达到代码重用、简化编程的目的public abstract | final class 子类名 extends 父类v语法:. 子类: 派生类(有父类派生而来)父类:超类 (派生类继承父类)计算机学院 *3、 类继承的层次结构v 1、单继承v 2、Object计算机学院 继承性成员变量的继承性v子类继承父类的成员变量作为自己的一个成员变量*8子类和父类在同一包中子类和父类不在同一包中父类中非private的成员变量publicprotected缺省publicprotected计算机学院 v所谓子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接定义了一样,可以被子类中自己定义的任何实例方法调用v父类的protected、public方法为子类的方法*9继承性成员方法的继承性!注意继承的成员变量或方法的访问权限保持不变。计算机学院 例1、v编写人类(包括姓名、性别、年龄)。再编写继承人类的学生类除了上述字段外 ,学生类还拥有学号字段和学习方法。构造人类和学生类的对象,输出有关信息。*10class 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; public 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( ) /学习方法计算机学院 *12Demo计算机学院 *Contents回顾类的定义1继承与派生2用protected声明受保护成员3关键字super4多态性5here计算机学院 用protected声明受保护成员vprotected可修饰类的字段和方法,这些成员能被所有派生子类直接或间接继承。v封装性要求除了final常量字段外,其它字段一律应为private。 v不可滥用protected修饰字段*14计算机学院 *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() 例2、计算机学院 例2、*16class Pupil2 extends Human2 private String stuNo; public Pupil2() public void learn( )super.getName() public class Example2 public static void main(String args) Human2 person = new Human2(“潘春花”, 女, 35); person.think(); Pupil2 aPupil = new Pupil2(“101”, “孙红海“, 男, 20); aPupil.think(); aPupil.learn(); 计算机学院 *Contents回顾类的定义1继承与派生2用protected声明受保护成员3关键字super4多态性5here计算机学院 *关键字superv1、用super调用父类构造方法子类不继承父类的构造方法子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句Demo计算机学院 v2、 用super访问父类字段和方法 使用形式:super.父类字段名super.父类方法名(可选实参表)Eg:super.name;super.getname();*19关键字super计算机学院 解决实际问题*20ManagerTest计算机学院 v1、成员变量的隐藏 子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。*21成员变量的隐藏Bank 计算机学院 方法重写v2、方法覆盖(Override)/方法重写 方法覆盖即指在子类中重新定义父类中已有的方法*22class Car int color_number; int door_number;int speed;public void push_break()speed = 0;public void add_oil( ) class Trash_Car extends Car double amount;public void fill_trash() public void push_break()speed = speed 10; 计算机学院 *(1)覆盖的语法规则如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。 方法重写计算机学院 *24(2)覆盖的目的子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。多态性的体现方法重写计算机学院 *25class Mammal /哺乳动物类 public void Shout() /呼叫方法 System.out.println(“不同类的动物叫声不同“); class Cat extends Mammal /继承动物类的猫类 public void Shout() /重写呼叫方法 System.out.println(“猫的叫声:喵.喵.“); class Dog extends Mammal /继承动物类的狗类public void Shout() /重写呼叫方法System.out.println(“狗的叫声:汪.汪.“);例3计算机学院 *26class 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 Dog(); animal.Shout(); animal = new Tiger(); animal.Shout(); 计算机学院 *27类类型变量赋值8.5.1 子类对象的上转型对象 v 子类由父类派生,可把子类对象赋给父类声明的变量。 如:Mammal animal = new Cat( ); v 或者: Mammal animal; Cat cat= new Cat();animal=cat;计算机学院 *28(1)上转型对象不能操作子类新增的成员字段和成员方法。(2)上转型对象能使用父类被继承或重写的成员方法、被继承或隐藏的成员变量。(3)如果子类重写了父类的方法,则上转型对象调用该方法时一定是重写后的方法(多态性)。(4)如果子类重新定义了父类的同名字段,即隐藏了父类的字段,则上转型对象访问该字段时必定是父类本身的字段。上转型对象的特征计算机学院 子类变量不能引用父类对象 v 父类对象没有下转型对象。 v 父类对象不能直接赋值给子类变量 v 如果一定要引用,则必须使用强制类型转换,语法: (类型名) 变量 v 比如: Pupil4 pupil = (Pupil4)human; v 注意:并不是所有强制类型转换都能成功,例如:把 马类的动物强制转换为鸟,就无法转换。无法转换时 会引发异常。计算机学院 兄弟类对象不能相互替换 v 如果鸟类、马类和鱼类都继承动物类,则它们是同一 层次的,是兄弟(姐妹)类。v 显然,鸟不是马,鸟也不是鱼,因此,不能把鸟对象 赋给马类或鱼类声明的变量。v 同一层次的兄弟类变量之间不能相互赋值,即兄弟类 对象间不能相互替换。计算机学院 多态性 v 类的多态性: 一是类本身方法重载 二是作为父类专用于派生方法重写 三是通过实现接口而充当接口的实例类型。计算机学院 *32调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。动态绑定静态绑定:对象方法的执行过程1)编译器查看对象的声明类型和方法名2)编译器查看调用方法时提供的参数类型3) 如果是private,static final或构造方法,编译器将可以准确地知道应该调用哪个方法。计算机学院 本章小结 v 类的继承与派生是一对互逆关系。 v 类是单一继承的,最顶层是根类Object。 v protected主要作用是声明能被所有派生子类继承的成员。 v 关键字super与超(父)类相关,可以调用超类构造方法,也 可访问被子类隐藏的父类字段,或调用重写的父类方法。 v 把子类对象赋给父类声明的变量,就变成了上转型对象。 v 但子类变量不能引用父类对象,兄弟类对象也不能相互替换。 v 关于多态性,主要表现在方法重写和方法重载上。前者涉及到 两个类,属于运行时多态,也叫动态多态性。而方法重载则是 在一个类内部,属于编译时多态,也叫静态多态性。它们的共 同点是方法名相同。计算机学院 实训8:人类派生与动物类派生 v (1)编程,编写人类Human,有私有的姓名、性别和 年龄字段,定义获取各个私有字段的受保护方法,再
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号