《java教程子类与继承》由会员分享,可在线阅读,更多相关《java教程子类与继承(79页珍藏版)》请在金锄头文库上搜索。
1、安徽大学安徽大学5.子类与继承子类与继承面向对象的特性面向对象的特性v继承性继承性 狮子拥有动物的一切基本特性,但同时又拥狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是有自己的独特的特性,这就是“继承继承”关系关系的重要性质。的重要性质。AnimalLion父类父类子类子类子类继承父类的非私有的基本属性和方法,子类继承父类的非私有的基本属性和方法,同时又能创建属于自己的属性的方法。同时又能创建属于自己的属性的方法。2创建子类创建子类v通过在类的声明中加入通过在类的声明中加入extends子句来创建一个类子句来创建一个类的子类:的子类:class SubClass extend
2、s SuperClass 创建子类创建子类 class Animal动物基本属性和方法;动物基本属性和方法; 属性:体重、高度、腿的数量;属性:体重、高度、腿的数量; 方法:进食、消化、排泄;方法:进食、消化、排泄;class Lion extends Animal 自动拥有动物类中允许继承的属性和方法;自动拥有动物类中允许继承的属性和方法;还可添加狮子特有的属性和方法;还可添加狮子特有的属性和方法; 比如:毛发颜色、性别、凶猛程度;比如:毛发颜色、性别、凶猛程度; 咆哮、捕猎、睡觉;咆哮、捕猎、睡觉; 继承的属性和方法新增的属性和方法v我们先认识一下类的我们先认识一下类的“祖先祖先”,即所有
3、类的根类;,即所有类的根类;v想象一下,什么是类的祖先?想象一下,什么是类的祖先?vpublic class Avvclass maintestvpublic static void main(String args) vA a;vv5默认继承类默认继承类java.lang.Object类:类: 所有类的祖先所有类的祖先class A相当于相当于class A extends java.lang.Object如果缺省如果缺省extends子句,则该类为子句,则该类为java.lang.Object的子类。的子类。java.lang.Object类类v它处于它处于Java开发环境的类层次树的根部
4、,其他所开发环境的类层次树的根部,其他所有的类都直接或间接地为它的子类。该类定义了有的类都直接或间接地为它的子类。该类定义了一些所有对象最基本的状态和行为,例如:一些所有对象最基本的状态和行为,例如:vequals()判断两个对象引用是否相同,等价于判断两个对象引用是否相同,等价于=vgetClass()返回一个对象在运行时所对应的类的表返回一个对象在运行时所对应的类的表示,从而可以得到相应的信息。示,从而可以得到相应的信息。vtoString()返回对象的字符串表示。返回对象的字符串表示。v class T1 v vpublic class Test1 v public static voi
5、d main(String args) v T1 t1=new T1();v T1 t2=new T1();v t2=t1;v boolean b;v b=t1.equals(t2);v System.out.println(b);v v8v接下来,分析一下多重继承和多层继承接下来,分析一下多重继承和多层继承9面向对象特性面向对象特性继承性继承性vJava中支持单继承。中支持单继承。v思考:为什么取消多重继承?思考:为什么取消多重继承?动物水栖生活动物陆栖生活动物水陆两栖动物10动物类动物类马类马类驴类驴类骡子类骡子类优点:继承二者优点缺点?11为什么取消多重继承?为什么取消多重继承?鱼类鱼类
6、鲫鱼类鲫鱼类家猪类家猪类猪类猪类12面向对象特性面向对象特性继承性继承性vJava中不支持多重继承。中不支持多重继承。vJava中支持多层继承中支持多层继承。v再思考一下继承的作用?再思考一下继承的作用?13v1、提高代码复用度,减少代码;、提高代码复用度,减少代码;v2、方便扩展,在以前的基础上进行改进、方便扩展,在以前的基础上进行改进v3、总之,取其精华、引入创新、总之,取其精华、引入创新14本章学习内容本章学习内容v1、子类继承父类的属性和方法、子类继承父类的属性和方法v2、父类的属性和方法不够用怎么办?、父类的属性和方法不够用怎么办? 研究:子类增加新的属性和方法研究:子类增加新的属性
7、和方法v3、父类如果想保留某些属性和方法怎么办?、父类如果想保留某些属性和方法怎么办? 研究:父类设定某些属性和方法不允许继承研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?、父类的某些属性和方法,不太适合子类怎么办?v 研究:子类修改父类的属性和方法研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?、父类不想被继承怎么办?v 研究:为了保密性,类可设置为不允许继承研究:为了保密性,类可设置为不允许继承v6、父类允许被继承,但是不想被修改属性和方法怎么办?、父类允许被继承,但是不想被修改属性和方法怎么办?v 父类的某些属性和方法允许继承,但是不允许
8、子类修改;父类的某些属性和方法允许继承,但是不允许子类修改;15子类的继承性子类的继承性v若子类和父类在同一个包内,子类可以继承父类中若子类和父类在同一个包内,子类可以继承父类中访问权限设定为访问权限设定为public、 protected、 default的成的成员变量和方法。员变量和方法。v若子类和父类不在同一个包内,子类可以继承父类若子类和父类不在同一个包内,子类可以继承父类中访问权限设定为中访问权限设定为public、 protected的成员变量的成员变量和方法。和方法。16例题例题 正常继承正常继承class Aint x;void setX(int x)this.x=x;int
9、getX()return x;class B extends Adouble y=12;void setY(int y)this.y=y+x;double getY()return y;例题例题 私有继承私有继承class Aprivate int x;void setX(int x)this.x=x;int getX()return x;Java技术及其应用技术及其应用class B extends Adouble y=12;void setY(int y)this.y=y+x;double getY()return y;18子类的继承性子类的继承性子类对象引用子类对象引用从父类继承的成员从
10、父类继承的成员子类特有的成员子类特有的成员从父类未继承的成员从父类未继承的成员vclass Av private int x=10;v protected double y=12.56;v void f() v y=y+x;v System.out.printf(x=%d,y=%fn,x,y);v vvclass B extends Av double z=12;v void g() v z=y+100;v System.out.printf(z=%fn,z);v vvclass Example v public static void main(String args) v B b=new
11、B();v b.f(); /调用从父类继承的方法。调用从父类继承的方法。B类本没有该方法类本没有该方法v b.g(); /调用子类自己声明的方法。调用子类自己声明的方法。v v20练习一练习一class Aprivate int x;int y; protected int z;class B extends Avoid f()x=1;void g()y=1;void h()z=1;指出程序中的错误?指出程序中的错误?练习二练习二package p1;class Aprivate int x;int y;protected int z;package p2;class B extends Av
12、oid f()x=1;void g()y=1;void h()z=1;public import p1.A;指出程序中的错误?指出程序中的错误?知识点小结知识点小结v1、只有、只有public类,才能被另一个包中的类继承;类,才能被另一个包中的类继承;v2、引入另一个包中的、引入另一个包中的public类,需要用类,需要用importv3、private类型的属性或方法不能被继承类型的属性或方法不能被继承v4、public类型的属性或方法一定可以被继承类型的属性或方法一定可以被继承v5、defalut 和和 protected类型呢?类型呢?23本章学习内容本章学习内容v1、子类继承父类的属性
13、和方法、子类继承父类的属性和方法v2、父类的属性和方法不够用怎么办?、父类的属性和方法不够用怎么办? 研究:子类增加新的属性和方法研究:子类增加新的属性和方法v3、父类如果想保留某些属性和方法怎么办?、父类如果想保留某些属性和方法怎么办? 研究:父类设定某些属性和方法不允许继承研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?父类的某些属性和方法,不太适合子类怎么办?v 研究:子类修改父类的属性和方法研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?、父类不想被继承怎么办?v 研究:为了保密性,类可设置为不允许继承研究:为了保密性,类可设置为不允许继
14、承v6、父类允许被继承,但是不想被修改属性和方法怎么办?、父类允许被继承,但是不想被修改属性和方法怎么办?v 父类的某些属性和方法允许继承,但是不允许子类修改;父类的某些属性和方法允许继承,但是不允许子类修改;24v如何修改父类的方法?通过方法重写实现!如何修改父类的方法?通过方法重写实现!v思考:方法的重载是什么?和重写的区别?思考:方法的重载是什么?和重写的区别?25同名!同名!class Aint x;void setX(int x)class B extends Aint x; /隐藏父类中的变量隐藏父类中的变量xvoid setX(int x) /重写父类中的方法重写父类中的方法se
15、tX()重写的方法必须与父类中的方法名字相同、重写的方法必须与父类中的方法名字相同、参数个数和类型相同,返回类型相同或是参数个数和类型相同,返回类型相同或是子类。子类。class Afloat computer(float x,float y)return x+y;public int g(int x,int y)return x+y;class B extends Afloat computer(float x,float y)return x*y;B b=new B();puter(8,9);b.g(12,8);A:computer()g()B:重写的重写的computer()继承的继承的
16、g()class AA g()return new A();A f()return new A();class B extends AB f()return new B();B b=new B();b.f();b.g();A:g()f()B:重写的重写的f ()继承的继承的g()返回值是子类返回值是子类思考思考1:下程序是否是重写?:下程序是否是重写?class Afloat computer(float x,float y)return x+y;public int g(int x,int y)return x+y;class B extends Adouble computer(float
17、 x,float y)return x*y;29思考思考2:下程序是否是重写?:下程序是否是重写?vclass Avv public int f(int x,int y)v v return x+y;v vvclass B extends Avv public int f(int x,int y,int z)v v return x*y;v v30思考思考3:重写时方法的权限管理:重写时方法的权限管理v重写父类的方法时,不可以降低方法的访问权限重写父类的方法时,不可以降低方法的访问权限class Aprotected float f(float x,float y)return x-y;cla
18、ss B extends Afloat f(float x,float y)return x+y;public float f(float x,float y)知识点小结知识点小结v方法重写与方法重载的区别方法重写与方法重载的区别方法重写:子类方法与父类方法同名,且参数方法重写:子类方法与父类方法同名,且参数个数类型一致,返回类型相同或子类。个数类型一致,返回类型相同或子类。方法重载:方法名相同,参数个数或类型不同,方法重载:方法名相同,参数个数或类型不同,返回类型相同返回类型相同v如果在子类中定义一个和父类一样的属性,则父如果在子类中定义一个和父类一样的属性,则父类的属性被隐藏;类的属性被隐
19、藏;v如果在子类中重写了父类的方法,则父类方法被如果在子类中重写了父类的方法,则父类方法被隐藏;隐藏;v如果在子类中需要调用被隐藏的属性或方法,怎如果在子类中需要调用被隐藏的属性或方法,怎么办呢?么办呢?v思考:在类和对象章节中,成员变量被局部变量思考:在类和对象章节中,成员变量被局部变量和参数变量隐藏时,怎么处理?和参数变量隐藏时,怎么处理?33引用父类成员引用父类成员vJava中通过中通过super来实现对父类成员的访问。来实现对父类成员的访问。1. 访问父类被隐藏的成员变量,如:访问父类被隐藏的成员变量,如:super.variable2. 调用父类中被重写的方法,如:调用父类中被重写的
20、方法,如:super.Method ( paramlist );3. 调用父类的构造函数,如调用父类的构造函数,如:super( paramlist );34分析程序的问题?分析程序的问题?vclass Av double f(double x,double y) v return x+y;v vclass B extends Av double f(double x,double y) v double m=f(x,y);v return m+x*y;v vclass cvpublic static void main(String args) vB b=new B();vSystem.ou
21、t.println(b.f(10.0,8.0);v35分析程序的问题?分析程序的问题?vclass Av double f(double x,double y) v return x+y;v vclass B extends Av double f(double x,double y) v double m=super.f(x,y);v return m+x*y;v vclass cvpublic static void main(String args) vB b=new B();vSystem.out.println(b.f(10.0,8.0);v36v既然子类继承了父类的部分属性和变量,
22、在创建既然子类继承了父类的部分属性和变量,在创建子类对象时,直接调用子类的构造函数。子类对象时,直接调用子类的构造函数。v此时,并没有显式的调用父类的构造函数,而子此时,并没有显式的调用父类的构造函数,而子类对象却能调用父类的属性和方法,类对象却能调用父类的属性和方法,v思考为什么?思考为什么?v当创建一个子类对象时,总是先调用父类的构造当创建一个子类对象时,总是先调用父类的构造方法,再调用子类的构造方法。方法,再调用子类的构造方法。37class Grandparent public Grandparent() System.out.println(GrandParent Created.)
23、; class Parent extends Grandparent public Parent() System.out.println(Parent Created); class Child extends Parent public Child() System.out.println(Child Created); Child c=new Child();v思考:父类有多个构造方法,子类创建对象时调思考:父类有多个构造方法,子类创建对象时调用哪个呢?用哪个呢?39class Grandparent public Grandparent() System.out.println(Gra
24、ndParent Created.); public Grandparent(int i) System.out.println(GrandParent Created2.); class Child extends Grandparent public Child() System.out.println(Child Created); Java技术及其应用技术及其应用Child c=new Child();40v思考:父类有多个构造方法,默认调用的是没有思考:父类有多个构造方法,默认调用的是没有参数的构造方法,如果想调用其他的构造方法怎参数的构造方法,如果想调用其他的构造方法怎么办呢?么办
25、呢?v能否在子类的构造函数中,直接调用父类的构造能否在子类的构造函数中,直接调用父类的构造函数呢?函数呢?41class Grandparent public Grandparent() System.out.println(GrandParent Created.); public Grandparent(int i) System.out.println(GrandParent Created2.); class Child extends Grandparent public Child() Grandparent(1); System.out.println(Child Created
26、); Java技术及其应用技术及其应用Child c=new Child();思考:意味着什么?思考:意味着什么?42v可知:可知:v通常情况下,子类不继承父类的构造方法。通常情况下,子类不继承父类的构造方法。v怎样调用父类的构造方法呢?怎样调用父类的构造方法呢?vsuper()函数函数43class Grandparent public Grandparent() System.out.println(GrandParent Created.); public Grandparent(int i) System.out.println(GrandParent Created2.); clas
27、s Child extends Grandparent public Child() super(1); System.out.println(Child Created); Java技术及其应用技术及其应用Child c=new Child();44v注意:注意:vSuper()函数,必须在子类构造函数的第一行使用()函数,必须在子类构造函数的第一行使用45class Grandparent public Grandparent() System.out.println(GrandParent Created.); public Grandparent(int i) System.out.p
28、rintln(GrandParent Created2.); class Child extends Grandparent public Child() System.out.println(Child Created); super(1); Java技术及其应用技术及其应用Child c=new Child();46子类的构造方法小结子类的构造方法小结v当创建一个子类对象时,总是先调用父类的构造当创建一个子类对象时,总是先调用父类的构造方法,再调用子类的构造方法。方法,再调用子类的构造方法。v如果子类的构造方法没有显示的调用父类的构造如果子类的构造方法没有显示的调用父类的构造方法方法sup
29、er(),则默认先调用父类的不带参数的那,则默认先调用父类的不带参数的那个构造方法。个构造方法。v通常情况下,子类不继承父类的构造方法。通常情况下,子类不继承父类的构造方法。Java多态性多态性v静态多态性(编译)静态多态性(编译)方法重载方法重载方法名相同,根据参数个数或类型不同,在方法名相同,根据参数个数或类型不同,在编译阶段决定执行不同的方法。编译阶段决定执行不同的方法。v动态多态性(运行)动态多态性(运行)方法重写方法重写方法名相同,参数相同,在运行阶段决定执方法名相同,参数相同,在运行阶段决定执行不同的方法。行不同的方法。48动态多态性实现的前提条件动态多态性实现的前提条件v将子类的
30、对象的引用放到父类的对象中。将子类的对象的引用放到父类的对象中。例如:例如:A类为父类,类为父类,B类为子类。类为子类。A a=new B();称称a是是new B()生成的对象的生成的对象的上转型对象。上转型对象。anew B()新增的变量和方法继承的变量和重写的方法49class Avoid callme()System.out.println(A);class B extends Avoid callme()System.out.println(B);class C extends Avoid callme()System.out.println(C);A a=new A();a.cal
31、lme();a=new B();a.callme();a=new C();a.callme();思考:思考:a.callme 调用哪个?调用哪个?重写方法的调用重写方法的调用va.callme();v动态多态性动态多态性vA a;va=new B();va=new C();va.callme();v对于重写的方法,对于重写的方法,Java运行时系统根据调用该运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。方法的实例的类型来决定选择哪个方法调用。 51class EspecialCarvoid cautionSound()class PoliceCar extends Especia
32、lCarvoid cautionSound()System.out.println(111);class AmbulanceCar extends EspecialCarvoid cautionSound()System.out.println(222);EspecialCar car=new PoliceCar();car.cautionSound();car=new AmbulanceCar();car.cautionSound();void f()car.f();小结小结v多态性多态性方法重载方法重载方法重写方法重写v子类对象引用赋值给父类对象,此父类对象称为子类对象引用赋值给父类对象,
33、此父类对象称为上转型对象。上转型对象。v上转型对象可以引用继承的变量和重写的方法,上转型对象可以引用继承的变量和重写的方法,不可以引用子类新增的变量和方法。不可以引用子类新增的变量和方法。本章学习内容本章学习内容v1、子类继承父类的属性和方法、子类继承父类的属性和方法v2、父类的属性和方法不够用怎么办?、父类的属性和方法不够用怎么办? 研究:子类增加新的属性和方法研究:子类增加新的属性和方法v3、父类如果想保留某些属性和方法怎么办?、父类如果想保留某些属性和方法怎么办? 研究:父类设定某些属性和方法不允许继承研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?
34、、父类的某些属性和方法,不太适合子类怎么办?v 研究:子类修改父类的属性和方法研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?、父类不想被继承怎么办?v 研究:为了保密性,类可设置为不允许继承研究:为了保密性,类可设置为不允许继承v6、父类允许被继承,但是不想被修改属性和方法怎么办?、父类允许被继承,但是不想被修改属性和方法怎么办?v 父类的某些属性和方法允许继承,但是不允许子类修改;父类的某些属性和方法允许继承,但是不允许子类修改;54final关键字关键字vfinal 修饰变量,变量就变成了常量;修饰变量,变量就变成了常量;vfinal 修饰方法,方法就不能再重写;修饰方法,方法
35、就不能再重写;vfinal 修饰类,类就不能再继承。修饰类,类就不能再继承。例如:例如:Java中的中的String类,对编译器和解释器的正类,对编译器和解释器的正常运行有很重要的作用,不能轻易改变它,常运行有很重要的作用,不能轻易改变它,因此把它修饰为因此把它修饰为final类,使他不能被继承,类,使他不能被继承,保证保证String类型的唯一性类型的唯一性55final 修饰类修饰类final class EspecialCarclass PoliceCar extends EspecialCar56final 修饰方法,方法就不能再重写修饰方法,方法就不能再重写class Especia
36、lCarvfinal void cautionSound()vSystem.out.println(111);vclass PoliceCar extends EspecialCarvvoid cautionSound()vSystem.out.println(222);v57final 修饰变量,变量就变成了常量修饰变量,变量就变成了常量vclass EspecialCarv vfinal int test;v void cautionSound()vSystem.out.println(111);vv58小结小结Final 关键字作用:关键字作用:vfinal 修饰变量,变量就变成了常量;
37、修饰变量,变量就变成了常量;vfinal 修饰方法,方法就不能再重写;修饰方法,方法就不能再重写;vfinal 修饰类,类就不能再继承。修饰类,类就不能再继承。59小结小结v1、子类继承父类的属性和方法、子类继承父类的属性和方法v2、父类的属性和方法不够用怎么办?、父类的属性和方法不够用怎么办? 研究:子类增加新的属性和方法研究:子类增加新的属性和方法v3、父类如果想保留某些属性和方法怎么办?、父类如果想保留某些属性和方法怎么办? 研究:父类设定某些属性和方法不允许继承研究:父类设定某些属性和方法不允许继承 4、父类的某些属性和方法,不太适合子类怎么办?、父类的某些属性和方法,不太适合子类怎么
38、办?v 研究:子类修改父类的属性和方法研究:子类修改父类的属性和方法 5、父类不想被继承怎么办?、父类不想被继承怎么办?v 研究:为了保密性,类可设置为不允许继承研究:为了保密性,类可设置为不允许继承v6、父类允许被继承,但是不想被修改属性和方法怎么办?、父类允许被继承,但是不想被修改属性和方法怎么办?v 父类的某些属性和方法允许继承,但是不允许子类修改;父类的某些属性和方法允许继承,但是不允许子类修改;60v思考:思考:v在设计父类时,有些方法可能不容易定义,在设计父类时,有些方法可能不容易定义,v比如:比如:v银行类:包含一个方法:计算利息;银行类:包含一个方法:计算利息;v由于各家银行计
39、算利息的方法不同,因此,在设由于各家银行计算利息的方法不同,因此,在设计银行类时,无法确定计算利息的方法;计银行类时,无法确定计算利息的方法;v能否在设计银行类时,只声明该方法,不写实现,能否在设计银行类时,只声明该方法,不写实现,然后在设计银行子类时,根据具体银行,对父类然后在设计银行子类时,根据具体银行,对父类的的“计算利息计算利息”方法进行重写方法进行重写?61abstract类类vabstract修饰类,修饰类,抽象类;抽象类;abstract class 类名类名成员变量;成员变量;成员方法;成员方法;(abstract方法或非方法或非abstract方法方法)v抽象类必须被继承抽象
40、类必须被继承v不能由抽象类声明对象;不能由抽象类声明对象;abstract方法方法vabstract修饰方法,抽象方法;修饰方法,抽象方法;abstract 成员方法成员方法();抽象方法只需声明,无需实现。抽象方法只需声明,无需实现。v抽象方法必须被重写。抽象方法必须被重写。抽象类抽象类(abstract class)v抽象类中可以包含抽象方法,抽象类中可以包含抽象方法,为所有子类定义为所有子类定义一个统一的接口一个统一的接口,但并不是必须的;,但并不是必须的;v一旦某个类中包含抽象方法,则这个类必须声一旦某个类中包含抽象方法,则这个类必须声明为抽象类明为抽象类64abstract clas
41、s Aabstract void callme( );void metoo( )System.out.println(Inside As metoo( ) method);class B extends Avoid callme( )System.out.println(Inside Bs callme( ) method);B a = new B( );a.callme( );a.metoo( );65面向抽象编程面向抽象编程vabstract类只关心操作,不关心操作具体实现细类只关心操作,不关心操作具体实现细节,可以使程序员把精力集中在程序的设计上,节,可以使程序员把精力集中在程序的设计上
42、,而不必拘泥于细节的实现。而不必拘泥于细节的实现。v即:设计者只需设计好方法,而具体方法实现由即:设计者只需设计好方法,而具体方法实现由子类的设计者实现。子类的设计者实现。v面向抽象编程:当设计一个类时,不让该类面向面向抽象编程:当设计一个类时,不让该类面向具体的类,而是面向抽象类。具体的类,而是面向抽象类。v核心思想:将核心思想:将abstract类声明的对象作为其子类类声明的对象作为其子类的上转型对象,利用它调用子类重写的方法。的上转型对象,利用它调用子类重写的方法。面向抽象编程举例面向抽象编程举例class Circle double radius; /圆的半径圆的半径 double g
43、etArea() return 3.1415926*radius*radius; 面向抽象编程举例面向抽象编程举例class PillarCircle bottom;double height;public double getVolume()return bottom.getArea()*height;只能求只能求圆柱体圆柱体面向抽象编程举例面向抽象编程举例class PillarGeometry bottom;double height;public double getVolume()return bottom.getArea()*height;abstract class Geomet
44、rypublic abstract double getArea();面向抽象编程举例面向抽象编程举例class Circle extends Geometry double radius; /圆的半径圆的半径 double getArea() return 3.1415926*radius*radius; class Rectangle extends Geometrydouble a,b;double getArea()return a*b;面向抽象编程举例面向抽象编程举例Pillar pillar;Geometry bottom;bottom=new Rectangle();pillar
45、=new Pillar(bottom,58);bottom=new Circle();pillar=new Pillar(bottom,58);例题例题5-13public abstract class Animal public abstract void cry(); public abstract String getAnimalName();public class Simulator public void playSound(Animal animal) System.out.print(现在播放现在播放+animal.getAnimalName()+类的声音类的声音:); ani
46、mal.cry(); 例题例题5-13public class Dog extends Animal public void cry() System.out.println(汪汪汪汪.汪汪汪汪); public String getAnimalName() return 狗狗; 例题例题5-13public class Cat extends Animal public void cry() System.out.println(喵喵喵喵.喵喵喵喵); public String getAnimalName() return 猫猫; 例题例题5-13public class Applicat
47、ion public static void main(String args) Simulator simulator = new Simulator(); simulator.playSound(new Dog(); simulator.playSound(new Cat(); 例题例题5-13public class Tiger extends Animal public void cry() System.out.println(“吼吼.吼吼吼吼); public String getAnimalName() return “老虎老虎; 小结小结v当系统中增加新的模块时,不需要修改现有
48、的模当系统中增加新的模块时,不需要修改现有的模块。块。v核心核心-闭闭v扩展扩展-开开框架的核心部分框架的核心部分框架的扩展部分框架的扩展部分SimulatorAnimalDogCatTiger再来一题再来一题HardWork.java练习练习v设计一个抽象类设计一个抽象类People,具有抽象方法,具有抽象方法say();v设计子类设计子类ChinaPeople,AmericaPeople,实现,实现抽象方法抽象方法say();v设计一个设计一个Speak类,提供类,提供speaking()方法,以上方法,以上转型对象作为参数,打印说话的内容。转型对象作为参数,打印说话的内容。v设计一个测试类设计一个测试类Test,测试,测试v再增加一个子类再增加一个子类AfricaPeople,实现抽象方法,实现抽象方法say();v添加到测试类中。添加到测试类中。