【精品】Java实用教程第9讲继承和多态精品ppt课件.ppt

上传人:1595****071 文档编号:71301766 上传时间:2023-02-02 格式:PPT 页数:36 大小:675.50KB
返回 下载 相关 举报
【精品】Java实用教程第9讲继承和多态精品ppt课件.ppt_第1页
第1页 / 共36页
【精品】Java实用教程第9讲继承和多态精品ppt课件.ppt_第2页
第2页 / 共36页
点击查看更多>>
资源描述

《【精品】Java实用教程第9讲继承和多态精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】Java实用教程第9讲继承和多态精品ppt课件.ppt(36页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Java实用教程第9讲继承和多态 Java通过两种方式来实现代码的复用,即组合和继承。组合是指创建新类时,新类中的成员是由现有类的对象组成,这种方式比较直观。而继承是指在现有类的基础上添加新的代码。这两种方式都不会破坏原有代码。9.1 组合组合在创建新类时,可以使用已有类的对象作为新类的成员,当然也可以创建基本数据类型的成员。下面的程序代码展示了组合技术:/CompositionDemo.javaclass Wheelint count;Wheel(int count)this.count=count;class Doorint count;Door(int count)this.count=

2、count;class Enginedouble displacement;Engine(double displacement)this.displacement=displacement;9.1 组合组合class CarString name;Wheel wheel=new Wheel(4);Door carDoor=new Door(4);Engine carEngine=new Engine(3.0);Car(String name)this.name=name;public class CompositionDemo public static void main(String a

3、rgs)Car car=new Car(宝马X6);System.out.println(车名:+car.name);System.out.println(排量:+car.carEngine.displacement);System.out.println(门:+car.carDoor.count);System.out.println(轮子:+car.wheel.count);上述代码中,类Car是由类String、类Wheel、类Door和类Engine组合而成的。9.2 继承继承 继承是面向对象程序设计中不可缺少的部分,Java是单根继承,不支持类似C+中的多继承。所以在Java中有一个

4、“祖先”类,名为Object,所有类都直接或间接的继承它,所有对象(包括数组)都实现这个类的方法。9.2.2 父类的初始化父类的初始化public class PortableComputer extends Computer PortableComputer()System.out.println(PortableComputer();public static void main(String args)PortableComputer myPc=new PortableComputer();上面程序的输出结果为:ElectricalEquipment()Computer()Portabl

5、eComputer()从上面程序的运行结果可以看出,创建子类的对象时,父类的构造方法先被调用,用来初始化包含在子类对象中的父类对象。ElectricalEquipment类和Computer类中只定义了无参构造方法,即创建子类对象中的父类对象时,使用的是父类的无参构造方法。那么能不能使用父类的有参构造方 法呢?答案是肯定的.9.2.2 父类的初始化父类的初始化关于子类构造方法中调用父类的构造方法的规则,现总结如下:(1)父类没有定义任何构造方法,或只定义了无参构造法,在创建子类对象时,会先无条件的调用父类的无参构造方法来初始化一个父类对象。(2)父类只定义了有参构造方法,在创建子类的对象时,在

6、子类构造方法中必须使用关键字super来代替父类的构造方法,而且super必须是子类构造方法的第一条语句。(3)父类既定义了无参构造方法,也定义了有参构造方法,在创建子类的对象时,可以使用super调用父类的有参构造方法,也可以不使用super,这时系统会自动调用父类的无参构造方法。9.2.3 再论方法重载再论方法重载 在一个类中可以定义多个同名的方法,这些方法通过参数的不同(参数的个数不同或类型不同)来区分,称为方法的重载。在父类中定义了某个方法,而在子类中也定义了名字相同的方法,但两个方法的参数不同,这是也构成了重载。下面程序代码展示了这种情况:9.2.3 再论方法重载再论方法重载/Ove

7、rloadInExtend.javaclass School void show(int i)System.out.println(show(+i+);void show(int i,int j)System.out.println(show(+i+,+j+);class University extends School void show(char c)System.out.println(show(+c+);public class OverloadInExtend public static void main(String args)University u=new Universi

8、ty();u.show(1);u.show(2,3);u.show(a);在在University类中有三个类中有三个show方法:方法:show(char c)、show(int i)和和show(int j),三个,三个方方 法构成重载方法,其中后两个法构成重载方法,其中后两个show方法是从父类方法是从父类School中继承过来的。中继承过来的。9.2.4 变量的隐藏和方法的重写变量的隐藏和方法的重写 因为子类可继承父类中的方法,所以子类不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父

9、类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。子类中也可以定义与父类中名字相同的成员变量,因为名字相同,在子类中,从父类继承过来的这个变量被隐藏。下面的程序代码展示了方法的重写和变量的隐藏:9.2.4 变量的隐藏和方法的重写变量的隐藏和方法的重写/Overriding.javaclass Tree double height=10.2;void printHeight()System.out.println(Tree height:+height);void printName(String name)System.out.println(Tree name:+n

10、ame);class Pine extends Tree double height=20.3;void printHeight()System.out.println(Pine tree height:+height);void printName(String name)System.out.println(Pine tree name:+name);public class Overriding public static void main(String args)Pine p=new Pine();p.printName(MyTree);p.printHeight();9.2.5 s

11、uper关键字关键字 在“父类的初始化”一节中证明了:在创建子类的对象时,会先创建一个父类的对象。那么,怎么去引用里面的父类对象呢?答案是使用super,this指的是当前对象的引用,而super是当前对象里面的父类对象的引用。下面是super的用法:(1)在子类构造方法中调用父类构造方法。示例程序如Square.java;(2)在子类中访问被重写的父类方法;(3)在子类中访问被隐藏的父类成员变量。9.3 final关键字关键字 被关键字final修饰的东西是不能被修改的,final可以修饰变量、方法和类。9.3.1 final修饰的变量修饰的变量 声明final字段有助于优化器作出更好的优化

12、决定,因为如果编译器知道字段的值不会更改,那么它能安全地在寄存器中高速缓存该值。final字段还通过让编译器强制该字段为只读来提供额外的安全级别。final修饰的变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于复合数据类型来说其引用不可再变。关键字final修饰的变量也可以定义为static的,称为静态常量,在内存中占据一段不能改变的存储区域,表示静态常量的名字全部用大写字母。9.3.1 final修饰的变量修饰的变量 下面程序展示了final的用法:/FinalData.javapublic class FinalData final int a=1;stat

13、ic final int B=2;final int c=1,2,3,4,5;public static void main(String args)FinalData f=new FinalData();/*f.a=10;/编译错误FinalData.B=20;/编译错误f.c=new int10;/编译错误*/f.c0=10;for(int i=0;i f.c.length;i+)System.out.print(f.ci+);9.3.2 空白空白final 在Java中,如果在声明变量时不给其赋值,系统可以对其进行自动初始化,基本类型变量自动初始化为0,其余类型变量自动初始化为空。但是f

14、inal类型的变量必须显示初始化,且初始化只能在两个地方进行:一是在定义处,二是在构造方法中。且不能同时即在定时时赋值,又在构造方法中赋值。如果在声明final的变量时没有给其赋值,则称为空白final,这个变量只有一次赋值机会,那就是在构造方法中。9.3.2 空白空白final下面程序展示了空白final的赋值:/BlankFinal.javapublic class BlankFinal private final int a;/空白finalvoid setA(int a)/this.a=a;/编译错误BlankFinal(int a)this.a=a;public static voi

15、d main(String args)BlankFinal blankFinal=new BlankFinal(10);/blankFinal.a=20;/编译错误System.out.println(blankFinal.a);9.3.3 final修饰的修饰的方法方法 如果一个类不允许其子类覆盖(重写)某个方法,则可以把这个方法声明为final的方法。另外,类中所有的private方法都被隐含是final的。由于无法取用private方法,则也无法对其重载。下面程序代码测试了final方法:9.3.3 final修饰的修饰的方法方法/FinalMethodDemo.javaclass Fi

16、nalMethodfinal void show()System.out.println(show()in FinalMethod);private void pMethod1()System.out.println(pMethod1 in FinlaMethod);private final void pMethod2()System.out.println(pMethod1 in FinlaMethod);public class FinalMethodDemo extends FinalMethod/final void show()/编译错误,不能重写(覆盖)show()方法priva

17、te void pMethod1()System.out.println(pMethod1 in FinalMethodDemo);private final void pMethod2()System.out.println(pMethod1 in FinalMethodDemo);public static void main(String args)FinalMethodDemo f1=new FinalMethodDemo();f1.pMethod1();f1.pMethod2();System.out.println(-);FinalMethod f2=f1;/f2.pMethod1

18、();/f2.pMethod2();9.3.4 final修饰的修饰的参数参数 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。另外,方法的参数被其内部类使用时,必须被声明为final的(将在第十讲中讲解内部类的相关内容)。/FinalArgument.javapublic class FinalArgument void show(final String s)/s=s+!;/编译错误System.out.println(s);public static void main(String args)FinalArgument f=new FinalArgument

19、();f.show(hello);f.show(java);9.3.5 final修饰的修饰的类类 final修饰的类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类以后不会再被扩展,那么就设计为final类/FinalClassDemo.javafinal class FinalClassvoid show()/默认被final修饰public class FinalClassDemo extends FinalClass/编译错误public static void main(Strin

20、g args)9.4 多态多态多态是指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态可以消除类型间的耦合关系。要理解Java中的多态,必须理解向上转型和动态绑定。9.4.1 向上转型向上转型在Java中,子类能够继承父类的所有成员,这是继承的重要作用,但继承最重要的作用在于能够表现父类和子类之间的关系,这种关系就是:能够把子类对象当做父类对象来使用。/DrawShape.javaclass Shape class Circle extends Shape public class DrawShape public static void main(String args)

21、Shape s=new Shape();Shape c=new Circle();/向上转型9.4.1 向上转型向上转型 上面程序中,把子类Circle创建的对象赋值给了父类Shape类型的引用c,即父类的引用c指向的是子类对象。在Java中,这种现象被称之为向上转型。之所以是向上转型,是因为在继承关系中,父类在子类的上层(Java是单根继承的),如图9.1所示:图9.1 类的继承关系图 在向上转型过程中,可能会发生方法的丢失,因为子类是父类的一个超集,可能比父类包含更多的方法。但这种转型总是安全的,因为子类继承了父类中所有的成员。9.4.1 向上转型向上转型对DrawShape.java进行

22、修改:/DrawShape.javaclass Shape void print()System.out.println(print();class Circle extends Shape void printR()System.out.println(printR();public class DrawShape public static void main(String args)Shape s=new Shape();s.print();System.out.println(-);Circle c=new Circle();c.print();c.printR();System.ou

23、t.println(-);Shape u=new Circle();/向上转型u.print();/u.printR();/方法丢失9.4.2 动态绑定动态绑定 如果子类重写了父类中的方法,子类对象向上转型后,使用父类引用调用这些重写的方法会产生什么结果呢?继续修改DrawShape.java:/DrawShape.javaclass Shape void print()System.out.println(Shape);class Circle extends Shape void print()System.out.println(Circle);public class DrawShap

24、e public static void main(String args)Shape s=new Shape();s.print();Circle c=new Circle();/向上转型c.print();9.4.2 动态绑定动态绑定 程序运行结果:Shape Circle 从上面程序的运行结果可以看出:父类引用c指向的是子类对象,但c.print()调用的是子类中重写过的方法。产生这种结果的原因是“动态绑定”。将一个方法调用同一个方法主体关联起来被称作绑定。若在程序执行前进行绑定,叫做前期绑定(C语言是前期绑定)。在运行时根据对象的类型进行的绑定称为后期绑定,也称为动态绑定或运行时绑定。

25、9.4.3 多态的好处多态的好处 正是因为Java对于非私有的实例方法采用的是动态绑定,保证了被向上转型的对象总能够产生正确的行为,从而在一定程度上消除了类型间的耦合关系。我们在设计代码时,只需考虑父类对象即可,不必关心子类对象,它适用于所有子类对象。下面程序代码展示了多态的好处:/DrawShape.javaclass Shape void print()System.out.println(Shape);class Circle extends Shape void print()System.out.println(Circle);class Rectangle extends Shap

26、e void print()System.out.println(Rectangle);9.4.3 多态的好处多态的好处class Square extends Shape void print()System.out.println(Square);public class DrawShape static void draw(Shape s)s.print();public static void main(String args)Shape s=new Shape();draw(s);s=new Circle();/向上转型draw(s);s=new Rectangle();/向上转型d

27、raw(s);s=new Square();/向上转型draw(s);在上面程序中,在设计draw方法时,让其接收父类Shape类型的参数,因为向上转型,此方法能够接收所有Shape的子类对象,因为动态绑定,s总能找到正确的print()方法。9.4.4 多态的缺陷多态的缺陷 在Java中多态只有非私有的实例方法才是多态的,私有方法、静态方法、域都不是多态的。看下面的两个例子:看下面的两个例子:/FaultOne.javapublic class FaultOne /public void show()private void show()System.out.println(FauletOn

28、e);public static void main(String args)FaultOne fault=new PrivateFult();fault.show();class PrivateFult extends FaultOne public void show()System.out.println(PrivateFult);9.4.4 多态的缺陷多态的缺陷/FaultTwo.javaclass SuperClass int a=10;public static void show()System.out.println(SuperClass);class SubClass ext

29、ends SuperClass int a=20;public static void show()System.out.println(SubClass);public class FaultTwo public static void main(String args)SuperClass s=new SuperClass();System.out.println(s.a=+s.a);s.show();System.out.println(-);SubClass s1=new SubClass();System.out.println(s1.a=+s1.a);s1.show();Syste

30、m.out.println(-);SuperClass s2=new SubClass();System.out.println(s2.a=+s2.a);s2.show();9.5 本讲小结本讲小结本讲首先讲述了实现代码复用的机制:组合和继承,然后讨论了关键字final的用法,最后讨论了Java中多态。讲后练习讲后练习1.设计一个表示二维平面上点的类Point,包含有表示坐标位置的protected类型的成员变量x和y,获取和设置x和y值的public方法。设计一个表示二维平面上圆的类Circle,它继承自类Point,还包含有表示圆半径的protected类型的成员变量r、获取和设置r值的public方法、计算圆面积的public方法。设计一个表示圆柱体的类Cylinder,它继承自类Circle,还包含有表示圆柱体高的protected类型的成员变量h、获取和设置h值的public方法、计算圆柱体体积的public方法。建立Cylinder对象,输出其轴心位置坐标、半径、面积、高及其体积的值。讲后练习讲后练习2、什么是向上转型和动态绑定?3、编写程序分别测试final修饰的变量、方法、参数和类具有什么特性。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁