第5章 继承与多态

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课本P104
-18-
抽象类
• 抽象类
抽象类和接口两种机 制的引入,使Java拥有 制的引入,使Java拥有 了强大的面向对象编 程能力。
在面向对象的概念中,所有的对象都是通过类来表述,但并 不是所有的类都是用来描绘对象的,如果一个类中没有包含 足够的信息来描绘一类具体的对象,这样的类就是抽象类。 抽象类的作用类似“模板”,其目的是要设计者按照它的格 式来修改并创建新的类,但是并不能直接由抽象类创建对象, 只能通过抽象类派生出新的类,再由新类来创建对象
-9-
多态
• 重写
当一个子类继承了一个父类时,可以在子类中直接使用 父类的属性和方法。如果父类的方法无法满足子类的需求, 则可以在子类中对父类的方法进行改造,也称作重写 (override)。重写是Java多态性的另一种体现。
• 重写的原则
重写的方法的签名必须要和被重写的方法的签名完全匹配; 重写的方法的签名必须要和被重写的方法的签名完全匹配; 重写的方法的返回值必须和被重写的方法的返回一致或者是其子类; 重写的方法的返回值必须和被重写的方法的返回一致或者是其子类; 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致, 重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者 是其子类; 是其子类; 私有方法不能被重写 子类重写父类方法的过程中,可访问性只能一样或变的更公开。 子类重写父类方法的过程中,可访问性只能一样或变的更公开。
• 聚合(has-a) has-a
聚合表现的则是类A包含类B的关系,如:一个Car类的对象包含一个 Motor类型的属性
• 继承(is-a)
加自己的特性
继承是面向对象编程的 继承表现的是一种共性与特性的关系,如果类B和类C继承自类A,那 一项核心技术,是面向 对象编程技术的一块基 么类A规定了类B和类C的共性,类B和类C在继承类A的基础上可以添 石
执行结果如下: 执行结果如下: In Base constructor! In Son constructor! a: 20,b: 100
-8-
• (4)派生类初始化 ) • 在创建派生类的对象时,使用派生类的构造方法对其初始化, 不但要对自身的成员变量赋初始值,还要对父类的成员变量 赋初始值。 • Java语言中,子类调用父类构造方法的原则: 1. 在子类的构造方法中,系统会自动添加一条语句:super();它 将调用父类的无参构造方法;若父类中没有无参构造方法时, 会出错。 2. 如父类是有参数的构造方法,子类可以通过在自己的构造方 法中使用super(参数);来调用它,且该语句必须是子类构造方 法的第一个可执行语句。
• null
“null”关键字用于标识未初始化的对象。可以将null赋值给引用类型变 量,但不可以赋给基本类型变量。
-16-
关键字super的作用是用来引用它直接的父类,它有两种 通用形式: 1. 调用父类的构造函数; • super(参数列表 参数列表); 参数列表 注意:每个子类的构造方法都隐含了一条super();语句, 注意:每个子类的构造方法都隐含了一条 ;语句, 用来调用父类的构造方法,若父类中没有无参构造方法, 用来调用父类的构造方法,若父类中没有无参构造方法, 该程序将出错。 该程序将出错。 2. 访问被子类的成员隐藏的父类成员。 • super . 成员 成员; • 这里的成员既可以是一个方法也可以是一个实例变量。 •
-7-
继承-5
• 演示在继承关系中构造方法的调用次序
public class Base { protected int a; public Base() { a = 20; System.out.println("In Base constructor!"); } public static void main(String[] args) { Son obj = new Son(); obj.print(); } } class Son extends Base { int b; public Son() { b = 100; System.out.println("In Son constructor!"); } public void print() { System.out.println("a: " + a + ",b: " + b); } }
-13-
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
class Actor{ void action(){}; } class Singer extends Actor { public void action(){ System.out.println("SUPESTAR"); } } class Dancer extends Actor { public void action(){ System.out.println("千手观音"); } } class Moive extends Actor { public void action(){ System.out.println("山楂树之恋"); } } class Director { public void go(Actor a){ a.action(); } public void goAll(Actor[] a){ for(int i=0;i<a.length;i++){ a[i].action(); } } }

-10-
多态 • 相同的事物,调用其相同的方法,参数也相同, 但是表现的行为却不同。这就是多态。 • 老师批评学生行为
-11-
• 在需要父类的地方子类实例以父类的身份出现 • 子类以父类的身份出现,但是做事情时,还是用 自己的方式来实现 • 子类以父类的身份出现时,自己特有的属性和行 为将不能被使用,只能使用子类和父类共有的属 性和方法可以使用
第五章
继承与多态
目标
理解继承和多态的概念 掌握继承、多态的实现和使用 掌握null、this、super、final关键字的使用 理解抽象类和接口的含义 掌握抽象类、接口的实现和使用 掌握Object类
-2-
继承
类之间的关系有三种 • 依赖(use-a)
依赖是一种常见的类之间的关系,如果在一个类A的方法中操作另外 一个类B的对象,那么类A依赖于类B
-17-
final
• final关键字
用来修饰类、方法和变量,其含义是“不可改变的、最终的” 。 修饰类:声明为 的类不能被继承, 修饰类:声明为final的类不能被继承,一个 的类不能被继承 一个final类中的所有方法 类中的所有方法 都隐式地指定为final。 。 都隐式地指定为 修饰变量:声明为 的变量是一个常量, 修饰变量:声明为final的变量是一个常量,在定义时必须给予初 的变量是一个常量 始值,变量一旦初始化,将不能改变。 始值,变量一旦初始化,将不能改变。 修饰方法:声明为 的方法不能被子类重写。 修饰方法:声明为final的方法不能被子类重写。 的方法不能被子类重写
-4-
继承-2
• 继承的实例分析
在一个学校的人事管理系统中,要存储教师和学生的信息,现采用 面向对象思想分析得到教师类和学生类 。其属性如下所示:
教师类( 教师类(Teacher) ) 姓名 年龄 性别 工资 所属院系 name age gender salary department 姓名 年龄 性别 成绩 年级 学生类( 学生类(Student) ) name age gender score grade
-3-
继承-1
• 关于继承
在Java中,被继承的类叫父类(parent class)或超类(super class),继承父类的类叫子类(subclass)或派生类(derived class)。 在Java中,关键字“extends”表示继承,后面紧跟父类的类名,格式 如下 : <access> <modifiers> class SubClass extends SuperClass{ //...... }
-20-
抽象类-1
• 抽象类实例
定义一个类Shape来演示抽象类的定义和使用 。
根据继承的设计思想, 根 根据继承的设计思想 。据继承的设计思想,完全可以 将教师和学生类的相同属性抽象 出来,作为父类, 出来,作为父类,然后为其子类 添加差异的属性
-5-
继承-3
• 类的继承关系图
-6-
继承-4
• 代码实现继承关系
Java中只支持单一继承, Java中只支持单一继承, public class Person { 即一个类只能继承一个父 private String name;// 姓名 类,而不能继承多个类。 private int age;// 年龄 private String gender;// 性别 ……//省略get和set方法 } class Teacher extends Person { private float salary;// 薪酬 private String department;// 部门 ……//省略get和set方法 } class Student extends Person { private int[] score;// 成绩 private String grade;// 年级 ……//省略get和set方法 }
-12-
多态的好处为什么要使用多态? • 多态参数 • 多个方法的参数,具有相同的父类,则以父类的 名义来声明方法的参数,由于子类都能以父类的 身份出现,所以方法只要定义一次就可以适应各 个子类了 • 异类集合(泛型) • 多个变量,具有相同的父类,则以父类的名义来 声明集合的类型,由于子类都能以父类的身份出 现,所以集合中可以保存各个子类的实例
-19-
• 抽象类与抽象方法 • abstract修饰的抽象类需要子类继承,在子类中实现抽象 修饰的抽象类需要子类继承, 修饰的抽象类需要子类继承 类中的抽象方法。抽象类被派生、 类中的抽象方法。抽象类被派生、抽象方法被子类实现后 才有意义。 才有意义。 • 抽象方法是只有返回值类型、方法名、方法参数而不定义 抽象方法是只有返回值类型、方法名、 方法体的一种方法。 方法体的一种方法。抽象方法的方法体在子类中才编写实 现。 • 注意:不能用 注意:不能用abstract修饰构造方法、静态方法和私有方 修饰构造方法、 修饰构造方法 也不能覆盖父类中的抽象方法。 法,也不能覆盖父类中的抽象方法。 • 抽象方法必须定义在抽象类中,但是抽象类中不一定必须 抽象方法必须定义在抽象类中, 包含抽象方法。抽象类是一种未实现的类, 包含抽象方法。抽象类是一种未实现的类,抽象类不能用 new实例化一个对象。 实例化一个对象。 实例化一个对象
-14-
• • • • • • • • • • • • •
public class Test031{ public static void main(String[] args){ Actor she =new Singer(); Actor jack =new Dancer(); Actor zhoudongyu =new Moive(); Director zhangyimou =new Director(); //zhangyimou.go(she); //zhangyimou.go(jack); //zhangyimou.go(zhoudongyu); Actor[] a={she,jack,zhoudongyu}; zhangyimou.goAll(a); } }
-15-
this、super、null
• this
“this”关键字代表当前所在类的对象,可用于解决变量的命名冲突和不 确定性问题。还可以使用this调用本类中的其它构造方法。
• super
“super”关键字代表父类对象。通过使用super关键字,可以访问父类 的属性或方法,也可以在子类构造方法中调用父类的构造方法,以便 初始化从父类继承的属性。
相关文档
最新文档