面向对象:继承和多态.ppt
《面向对象:继承和多态.ppt》由会员分享,可在线阅读,更多相关《面向对象:继承和多态.ppt(43页珍藏版)》请在三一办公上搜索。
1、Java程序设计,重庆交大,2023/10/5,上一章内容回顾,5.面向对象:构造方法,封装与隐藏构造器理解构造器构造器的重载封装理解封装访问控制符包(package)包及其作用package和import语句Java的常用包,2023/10/5,6.面向对象:继承和多态,6.1 类的继承6.1.1 继承的特点6.1.2 重写父类的方法6.1.3 父类实例的super引用6.1.4 调用父类的构造器6.2 多态6.2.1 多态性6.2.2 引用变量的强制类型转换6.2.3 instanceof运算符6.3 继承和组合6.4 课后作业,2023/10/5,6.1 类的继承6.1.1 继承的特点,
2、继承是面向对象三大特征之一,也是实现软件复用的重要手段。Java的继承通过关键字extends来实现,实现继承的类称为子类,被继承的类称为基类、超类、父类。父类与子类的关系,是一种一般和特殊的关系。例如水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种特殊的水果。因为子类是一种特殊的父类,因此父类包含的范围总比子类包含的范围要大,因此父类是大类,子类是小类。Java的继承是单继承,每个类最多只有一个直接父类。,2023/10/5,6.1 类的继承6.1.1 继承的特点,Java里子类继承父类的语法格式如下:修饰符 class subclass extends superclass
3、/类定义部分“extends”的含义是子类扩展了父类,将可以获得父类的全部属性和方法,但子类不能获得父类构造方法。以下程序示范了子类继承父类的特点。,2023/10/5,6.1 类的继承6.1.1 继承的特点,程序清单:chapter06test1Fruit.java、Apple.java,package chapter06.test1;public class Fruit public double weight;public void info()System.out.println(我是一个水果!重+weight+g!);,package chapter06.test1;public c
4、lass Apple extends Fruit public static void main(String args)/创建Apple的对象 Apple a=new Apple();/Apple对象本身没有weight属性。/因为Apple的父类有weight属性,也可以访问Apple对象的属性 a.weight=56;/调用Apple对象的info方法 a.info();,该程序的输出结果为:我是一个水果!重56.0g!,2023/10/5,6.1 类的继承6.1.1 继承的特点,2023/10/5,6.1 类的继承6.1.2 重写父类的方法,子类扩展了父类,子类是一个特殊的父类。大部分
5、时候,子类总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。例如,鸟类都包含了飞翔(fly)的方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,因此,鸵鸟需要重写鸟类的方法。下面程序先定义一个Bird类。,2023/10/5,6.1 类的继承6.1.2 重写父类的方法,程序清单:chapter06test1Bird.java,package chapter06.test1;public class Bird/Bird类的fly方法 public void fly()System.out.prin
6、tln(我在天空里自由自在地飞翔.);,2023/10/5,6.1 类的继承6.1.2 重写父类的方法,下面再定义一个Ostrich类,这个类扩展了Bird类,但重写了Bird类的fly方法。程序清单:chapter06test1Ostrich.java,package chapter06.test1;public class Ostrich extends Bird/重写Bird类的fly方法 public void fly()System.out.println(我只能在地上奔跑.);public static void main(String args)/创建Ostrich对象 Ostr
7、ich os=new Ostrich();/执行Ostrich对象的fly方法,将输出我只能在地上奔跑.os.fly();,该程序的输出结果为:我只能在地上奔跑.,2023/10/5,6.1 类的继承6.1.2 重写父类的方法,这种子类包含父类同名方法的现象被称为方法重写,也称为方法覆盖(Override)。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。方法的重写要遵循“两同两小一大”。两同:方法名相同;形参列表相同。两小:子类方法返回值类型应比父类方法返回值类型更小(即子类)或相同;子类方法声明抛出的异常应比父类方法声明抛出的异常类更小或相同。一大:子类方法的访问控制权限应比父类
8、方法更大或相等。,2023/10/5,6.1 类的继承6.1.2 重写父类的方法,注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法;不能一个是类方法,一个是实例方法,否则编译出错。当子类覆盖了父类方法后,子类的对象将无法直接访问父类中被覆盖的方法,如果需要访问,可以使用super(被覆盖的是实例方法)或者父类名(被覆盖的是类方法)作为调用者来调用父类被覆盖的方法。如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就无法重写该方法;如果子类定义了一个与父类private方法具有相同方法名、相同形参列表、相同返回值类型的方法,依然不是重写,只是
9、在子类中重新定义了一个新方法。,2023/10/5,6.1 类的继承 父类实例的super引用,(1)通过super引用调用父类被覆盖的方法如果需要在子类中调用父类被覆盖的实例方法,可以通过关键字super作为调用者来调用父类被覆盖的方法。super是Java提供的一个关键字,它是直接父类的默认引用。例如,为上面的Ostrich类添加callOverridedMethod方法,在其中调用Bird类被覆盖的fly方法。完整的Ostrich类代码如下。程序清单:chapter06test1Ostrich.java,2023/10/5,6.1 类的继承 父类实例的super引用,package ch
10、apter06.test1;public class Ostrich extends Bird/重写Bird类的fly方法 public void fly()System.out.println(我只能在地上奔跑.);public void callOverridedMethod()/在子类方法中通过super来显式调用父类被覆盖的方法。super.fly();public static void main(String args)/创建Ostrich对象 Ostrich os=new Ostrich();/执行Ostrich对象的fly方法,将输出我只能在地上奔跑.os.fly();os.c
11、allOverridedMethod();,该程序的输出结果为:我只能在地上奔跑.我在天空里自由自在地飞翔.,2023/10/5,6.1 类的继承 父类实例的super引用,2023/10/5,6.1 类的继承 父类实例的super引用,2023/10/5,6.1 类的继承 父类实例的super引用,(2)通过super引用访问父类的属性如果子类定义了和父类同名的属性,也会发生子类属性覆盖父类属性的情形。正常情况下,子类里定义的方法访问该属性,都是访问子类属性,无法访问到父类被覆盖的属性。但在子类定义的实例方法中可以通过super引用来访问父类被覆盖的属性。详见下面的例子程序清单:chapte
12、r06SubClass.java,2023/10/5,6.1 类的继承 父类实例的super引用,package chapter06;class BaseClass public int a=5;public class SubClass extends BaseClass public int a=7;public void accessOwner()System.out.println(a);public void accessBase()/通过super来访问方法调用者对应的父类对象 System.out.println(super.a);public static void main(
13、String args)SubClass sc=new SubClass();/直接访问SubClass对象的a属性将会输出7 System.out.println(sc.a);sc.accessOwner();/输出7 sc.accessBase();/输出5,该程序的输出结果为:775,2023/10/5,6.1 类的继承 调用父类的构造器,(1)通过super引用调用父类的构造器在一个构造器中调用另一个重载的构造器要使用this引用来调用。在子类构造器中调用父类构造器要使用super引用来调用。详见下面的例子。程序清单:chapter06test1Sub.java,2023/10/5,6
14、.1 类的继承 调用父类的构造器,package chapter06.test1;class Base public double size;public String name;public Base(double size,String name)this.size=size;this.name=name;,public class Sub extends Base public String color;public Sub(double size,String name,String color)/通过super调用来调用父类构造器的初始化过程 super(size,name);thi
15、s.color=color;public static void main(String args)Sub s=new Sub(5.6,测试对象,红色);/输出Sub对象的三个属性 System.out.println(s.size+-+s.name+-+s.color);,该程序的输出结果为:5.6-测试对象-红色,2023/10/5,6.1 类的继承 调用父类的构造器,(2)构造器的调用顺序在调用子类的构造器创建一个子类实例时,父类构造器总会在子类构造器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行其父类的构造器,;以此类推,创建任何Java对象,最先执行的总是类的构造器。详见下
16、面的例子。程序清单:chapter06test1Wolf.java,2023/10/5,6.1 类的继承 调用父类的构造器,package chapter06.test1;class Creature public Creature()System.out.println(Creature无参数的构造器);class Animal extends Creature public Animal(String name)System.out.println(Animal带一个参数的构造器,该动物的name为+name);public Animal(String name,int age)/使用th
17、is调用同一个重载的构造器 this(name);System.out.println(Animal带2个参数的构造器,其age为+age);,public class Wolf extends Animal public Wolf()/显式调用父类有2个参数的构造器 super(土狼,3);System.out.println(Wolf无参数的构造器);public static void main(String args)new Wolf();,该程序的输出结果为:Creature无参数的构造器Animal带一个参数的构造器,该动物的name为土狼Animal带2个参数的构造器,其age为
18、3Wolf无参数的构造器,2023/10/5,6.2 多态,Java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时的类型不一致,这就有可能出现所谓的多态(Polymorphism)。,2023/10/5,6.2 多态6.2.1 多态性,先看以下例子。程序清单:chapter06test2SubClass.java,package chapter06.test2;class BaseClass public int book=6;public void base()System.
19、out.println(父类的普通方法);public void test()System.out.println(父类的被覆盖的方法);,public class SubClass extends BaseClass/重新定义一个book实例属性覆盖父类的book实例属性 public String book=轻量级J2EE企业应用实战;public void test()System.out.println(子类的覆盖父类的方法);public void sub()System.out.println(子类的普通方法);public static void main(String args
20、)/下面编译时类型和运行时类型完全一样,因此不存在多态 BaseClass bc=new BaseClass();/输出 6 System.out.println(bc.book);/下面两次调用将执行BaseClass的方法 bc.base();bc.test();,该程序的输出结果为:6父类的普通方法父类的被覆盖的方法轻量级J2EE企业应用实战父类的普通方法子类的覆盖父类的方法子类的普通方法6父类的普通方法子类的覆盖父类的方法,2023/10/5,6.2 多态6.2.1 多态性,package chapter06.test2;class BaseClass public int book=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 继承
链接地址:https://www.31ppt.com/p-6213426.html