面向对象:继承和多态.ppt
《面向对象:继承和多态.ppt》由会员分享,可在线阅读,更多相关《面向对象:继承和多态.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java程序设计程序设计重庆交大2上一章内容回顾5.面向对象:构造方法,封装与隐藏:构造器理解构造器构造器的重载:封装理解封装访问控制符:包(package)包及其作用package和import语句Java的常用包1/8/202336.面向对象:继承和多态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 课后作业1/8/202346.1 类的继承6.1.1 继承的特点:继承是面向对象三大特
2、征之一,也是实现软件复用的重要手段。:Java的继承通过关键字extendsextends来实现,实现继承的类称为子类子类子类子类,被继承的类称为基类基类基类基类、超类超类超类超类、父类父类父类父类。父类与子类的关系,是一种一般和特殊一般和特殊一般和特殊一般和特殊的关系。例如水果和苹果的关系,苹果继承了水果,苹果是水果的子类,则苹果是一种特殊的水果。:因为子类是一种特殊的父类,因此父类包含的范围总比子类包含的范围要大,因此父类是大类,子类是小类因此父类是大类,子类是小类。:Java的继承是单继承单继承单继承单继承,每个类最多只有一个直接父类。1/8/202356.1 类的继承6.1.1 继承的
3、特点:Java里子类继承父类的语法格式如下:修饰符修饰符 class subclass extendsextends superclass /类定义部分类定义部分:“extends”的含义是子类扩展了父类,将可以获得父类的全部属性和方法,但子类不能获得父类构造方法。:以下程序示范了子类继承父类的特点。1/8/202366.1 类的继承6.1.1 继承的特点:程序清单:chapter06test1Fruit.java、Apple.javapackage chapter06.test1;public class Fruit public double weight;public void info
4、()System.out.println(我是一个水果!重+weight+g!);package chapter06.test1;public class Apple extends Fruit public static void main(String args)/创建Apple的对象 Apple a=new Apple();/Apple对象本身没有weight属性。/因为Apple的父类有weight属性,也可以访问Apple对象的属性 a.weight=56;a.weight=56;/调用Apple对象的info方法 a.info();a.info();该程序的输出结果为:该程序的输出
5、结果为:我是一个水果!重我是一个水果!重56.0g!1/8/202376.1 类的继承6.1.1 继承的特点1/8/202386.1 类的继承6.1.2 重写父类的方法:子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法子类需要重写父类的方法子类需要重写父类的方法子类需要重写父类的方法。:例如,鸟类都包含了飞翔(fly)的方法,其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合鸵鸟,因此,这个飞翔方法明显不适合鸵鸟,因此,鸵鸟需要重写鸟类的方法鸵鸟需要重写
6、鸟类的方法。:下面程序先定义一个Bird类。1/8/202396.1 类的继承6.1.2 重写父类的方法:程序清单:chapter06test1Bird.javapackage chapter06.test1;public class Bird /Bird类的fly方法 public void fly()System.out.println(我在天空里自由自在地飞翔.);1/8/2023106.1 类的继承6.1.2 重写父类的方法:下面再定义一个Ostrich类,这个类扩展了Bird类,但重写了Bird类的fly方法。:程序清单:chapter06test1Ostrich.javapacka
7、ge chapter06.test1;public class Ostrich extends Bird /重写Bird类的fly方法 publicpublic voidvoid fly()fly()System.out.println(System.out.println(我只能在地上奔跑我只能在地上奔跑我只能在地上奔跑我只能在地上奔跑.);.);public static void main(String args)/创建Ostrich对象 Ostrich os=new Ostrich();/执行Ostrich对象的fly方法,将输出我只能在地上奔跑.os.fly();该程序的输出结果为:
8、该程序的输出结果为:我只能在地上奔跑我只能在地上奔跑.1/8/2023116.1 类的继承6.1.2 重写父类的方法:这种子类包含父类同名方法的现象被称为方法重写方法重写方法重写方法重写,也称为方方方方法覆盖法覆盖法覆盖法覆盖(Override)(Override)。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。方法的重写要遵循“两同两小一大两同两小一大两同两小一大两同两小一大”。:两同两同两同两同:1.方法名相同;2.形参列表相同。:两小两小两小两小:1.子类方法返回值类型应比父类方法返回值类型更小(即子类即子类)或相同;2.子类方法声明抛出的异常应比父类方法声明抛出的异常类更小
9、或相同。:一大一大一大一大:1.子类方法的访问控制权限应比父类方法更大或相等。1/8/2023126.1 类的继承6.1.2 重写父类的方法:注意:1.覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法;不能一个是类方法,一个是实例方法,否则编译出错。2.当子类覆盖了父类方法后,子类的对象将无法直接访问父类中被覆盖的方法,如果需要访问,可以使用super(super(被覆被覆被覆被覆盖的是实例方法盖的是实例方法盖的是实例方法盖的是实例方法)或者父类名父类名父类名父类名(被覆盖的是类方法被覆盖的是类方法被覆盖的是类方法被覆盖的是类方法)作为调用者来调用父类被覆盖的方法。3.如果父类方法具有pr
10、ivate访问权限,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就无法重写该方法;如果子类定义了一个与父类private方法具有相同方法名、相同形参列表、相同返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新方法。1/8/2023136.1 类的继承 父类实例的super引用(1)通过通过super引用调用父类被覆盖的方法引用调用父类被覆盖的方法:如果需要在子类中调用父类被覆盖的实例方法,可以通过关键字supersuper作为调用者来调用父类被覆盖的方法。:super是Java提供的一个关键字,它是直接父类的默认引用。:例如,为上面的Ostrich类添加callOverri
11、dedMethod方法,在其中调用Bird类被覆盖的fly方法。:完整的Ostrich类代码如下。:程序清单:chapter06test1Ostrich.java1/8/2023146.1 类的继承 父类实例的super引用package chapter06.test1;public class Ostrich extends Bird /重写Bird类的fly方法 public void fly()System.out.println(我只能在地上奔跑.);public void callOverridedMethod()/在子类方法中通过super来显式调用父类被覆盖的方法。supersu
12、per.fly();.fly();public static void main(String args)/创建Ostrich对象 Ostrich os=new Ostrich();/执行Ostrich对象的fly方法,将输出我只能在地上奔跑.os.fly();os.callOverridedMethod();该程序的输出结果为:该程序的输出结果为:我只能在地上奔跑我只能在地上奔跑.我在天空里自由自在地飞翔我在天空里自由自在地飞翔.1/8/2023156.1 类的继承 父类实例的super引用1/8/2023166.1 类的继承 父类实例的super引用1/8/2023176.1 类的继承 父
13、类实例的super引用(2)通过通过super引用访问父类的属性引用访问父类的属性:如果子类定义了和父类同名的属性,也会发生子类属性覆子类属性覆子类属性覆子类属性覆盖父类属性盖父类属性盖父类属性盖父类属性的情形。正常情况下,子类里定义的方法访问该属性,都是访问子类属性,无法访问到父类被覆盖的属性。但在子类定义的实例方法中可以通过supersuper引用引用引用引用来访问父类被覆盖的属性。详见下面的例子:程序清单:chapter06SubClass.java1/8/2023186.1 类的继承 父类实例的super引用package chapter06;class BaseClass publi
14、c 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(System.out.println(supersuper.a);.a);public static void main(String args)SubClass sc=new SubClass();/直接访问SubClass对象的a属性将会
15、输出7 System.out.println(sc.a);sc.accessOwner();/输出7 sc.accessBase();/输出5 该程序的输出结果为:该程序的输出结果为:7751/8/2023196.1 类的继承 调用父类的构造器(1)通过通过super引用调用父类的构造器引用调用父类的构造器:在一个构造器中调用另一个重载的构造器要使用thisthis引用引用引用引用来调用。在子类构造器中调用父类构造器要使用supersuper引引引引用用用用来调用。详见下面的例子。:程序清单:chapter06test1Sub.java1/8/2023206.1 类的继承 调用父类的构造器pa
16、ckage 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调用来调用父类构造器的初始化过程 supersuper(size,name);(size,name);this.c
17、olor=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-测试对象测试对象-红色红色1/8/2023216.1 类的继承 调用父类的构造器(2)构造器的调用顺序构造器的调用顺序:在调用子类的构造器创建一个子类实例时,父类构造器总父类构造器总父类构造器总父类构造器总会在子类构造器之前执行会在子类构造器之前执行会在子类构造器之前执行会在子类构造
18、器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行其父类的构造器,;以此类推,创建任何Java对象,最先执行的总是类的构造器。详见下面的例子。:程序清单:chapter06test1Wolf.java1/8/2023226.1 类的继承 调用父类的构造器package chapter06.test1;class Creature public Creature()System.out.println(Creature无参数的构造器);class Animal extends Creature public Animal(String name)System.out.println(An
19、imal带一个参数的构造器,该动物的name为+name);public Animal(String name,int age)/使用this调用同一个重载的构造器 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();该程序的输出
20、结果为:该程序的输出结果为:Creature无参数的构造器无参数的构造器Animal带一个参数的构造器,该动物的带一个参数的构造器,该动物的name为土狼为土狼Animal带带2个参数的构造器,其个参数的构造器,其age为为3Wolf无参数的构造器无参数的构造器1/8/2023236.2 多态:Java引用变量有两个类型两个类型两个类型两个类型:一个是编译时的类型编译时的类型编译时的类型编译时的类型,一个是运行时的类型运行时的类型运行时的类型运行时的类型,编译时的类型由声明该变量时使用的类型编译时的类型由声明该变量时使用的类型编译时的类型由声明该变量时使用的类型编译时的类型由声明该变量时使用的
21、类型决定,运行时的类型由实际赋给该变量的对象决定决定,运行时的类型由实际赋给该变量的对象决定决定,运行时的类型由实际赋给该变量的对象决定决定,运行时的类型由实际赋给该变量的对象决定。:如果编译时类型和运行时的类型不一致如果编译时类型和运行时的类型不一致如果编译时类型和运行时的类型不一致如果编译时类型和运行时的类型不一致,这就有可能出现所谓的多态多态多态多态(Polymorphism)(Polymorphism)。1/8/2023246.2 多态6.2.1 多态性:先看以下例子。:程序清单:chapter06test2SubClass.javapackage chapter06.test2;cl
22、ass BaseClass public int book=6;public void base()System.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
23、.out.println(子类的普通方法);public static void main(String args)/下面编译时类型和运行时类型完全一样,因此不存在多态 BaseClass bc=new BaseClass();/输出 6 System.out.println(bc.book);/下面两次调用将执行BaseClass的方法 bc.base();bc.test();该程序的输出结果为:该程序的输出结果为:6父类的普通方法父类的普通方法父类的被覆盖的方法父类的被覆盖的方法轻量级轻量级J2EE企业应用实战企业应用实战父类的普通方法父类的普通方法子类的覆盖父类的方法子类的覆盖父类的方法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 继承
限制150内