《05 深入Java面向对象电子课件 Java程序设计案例教程.pptx》由会员分享,可在线阅读,更多相关《05 深入Java面向对象电子课件 Java程序设计案例教程.pptx(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、模块5深入Java面向对象学习目标01了解Java面向对象程序设计的思想原则。02掌握类的结构、定义及对象的创建和使用。03掌握成员变量(实例变量、静态变量)和成员常量(实例常量、静态常量)的定义和使用。05理解访问控制、数据安全性、包及封装的概念。04掌握成员方法(实例方法、静态方法)的定义和使用,以及成员方法重载的概念。06掌握构造方法(隐式、显式)的定义和使用,以及构造方法重载的概念。07掌握this关键字的使用。08了解基本数据类型变量和引用数据类型变量在数值传递上的区别。技能目标1.能够在MyEclipse IDE中定义子类继承父类。2.能够在子类的定义中使用super关键字及重写父
2、类的成员方法。3.能够使用instanceof运算符判断对象类型。4.能够在MyEclipse IDE中定义抽象类及定义子类继承抽象父类。5.能够在MyEclipse IDE中定义接口及定义类实现接口。5.1 回顾与思考在模块4我们以Circle类为例,从类的定义入手,详细分析了类的构成和使用。如果现在面临一个任务:设计一个扇形类Sector,提供计算扇形的弧长、周长和面积的方法。我们该如何解决这个问题?一个办法是完整地定义扇形类Sector,包括所有必需的成员变量及常量、构造方法、成员方法等。这个办法有个缺点,就是必须重新开始一个类的定义。能否在已完成工作的基础上(如利用Circle类),适
3、当添加或改动部分代码,完成扇形类Sector的定义?答案是可行的。但是在编写过程中需要遵循另一个重要的面向对象设计原则:继承。5.2 继承继承可以充分利用现有的代码,解决编程过程中代码冗余的问题,它是实现代码重用的有效手段之一。被继承的类被称为父类或超类(superclass),由继承而得到的类被称为子类(subclass)。继承增强了代码的重用性,增强了软件的扩展性。Java中只允许单一继承,不允许多重继承,即每个类只能有一个父类。5.2 继承Java中通过关键字extends实现子类对父类的继承。定义子类的基本语法格式如下。修饰符 class 子类名 extends 父类名 /类体 除了增
4、加“extends 父类名”以外,其余含义和类的定义相似,可参阅4.2节。5.2 继承5.2.1 继承的实现【例5-1】定义类Sector,代表扇形,继承Circle类,提供计算扇形的弧长、周长和面积的方法。首先在ch5.example包中定义父类Circle。在MyEclipse IDE中,右击myPro项目下src目录的ch5.example目录,在弹出的快捷菜单中执行“New”“Class”命令,在弹出的“New Java Class”窗口中输入类名Circle,如图5-1所示。图5-1 创建父类Circle图5-1 创建父类Circle5.2 继承5.2.1 继承的实现【例5-1】单击
5、Finish按钮,完成父类Circle的创建。文件名为Circle.java,其代码如下。见书本P100-101。然后定义子类Sector。可以手动输入子类Sector的代码,也可以采用相对规范的操作方式创建Sector类,步骤如下:右击myPro项目下src目录的ch5.example目录,在弹出的快捷菜单中执行“New”“Class”命令,在弹出的“New Java Class”窗口中输入类名Sector,如图5-2所示。再 单 击 Superclass文 本 框 右 边 的 Browse按 钮,打 开“Superclass Selection”窗口,如图5-3所示。5.2 继承5.2.1
6、 继承的实现【例5-1】图5-2 创建子类Sector图5-3 选择父类Circle5.2 继承5.2.1 继承的实现【例5-1】图5-4 完成子类Sector的创建在“Choose a type”文本框中输入Cir,在“Matching items”列表框中会显示相应路径下的Circle类,选择要继承的父类Circle,单击OK按钮,返回“New Java Class”窗口。此时,在Superclass文本框中出现了所要继承的父类Circle,如图5-4所示。5.2 继承5.2.1 继承的实现【例5-1】单击Finish按钮,完成子类Sector的创建。文件名为Sector.java,其代码
7、如下。见书本P103-104。最后,编写一个测试类对子类Sector的功能进行检验。文件名为Example5_1.java,其代码如下。5.2 继承5.2.1 继承的实现【例5-1】运行结果如下。5.2 继承5.2.2 super关键字使用super关键字引用父类构造方法的基本语法格式如下。super(参数列表);其中,参数列表是可选项,参数间用“,”分隔。使用super关键字引用父类成员变(常)量的基本语法格式如下。super.成员变(常)量名;使用super关键字引用父类成员方法的基本语法格式如下。super.方法名(参数列表);其中,参数列表是可选项,参数间用“,”分隔。5.2 继承5.
8、2.3 构造方法继承子类中的每一个构造方法都必须继承父类中的某个且仅一个构造方法。如果子类要继承父类中的某个显式构造方法,在子类构造方法内的第一行语句必须是“super(父类构造方法参数列表);”。例如,Sector类的构造方法public Sector(double radius,double cAngle)中的第一行语句“super(radius);”表示继承父类Circle中的构造方法public Circle(double radius)。5.2 继承5.2.4 调用父类成员方法和成员变(常)量在子类的构造方法和成员方法中均可以直接通过方法名调用父类成员方法。但是,如果父类的成员方法在
9、子类中已被重写,就不能用子类对象直接调用父类中的成员方法了,而只能通过语句“super.方法名(参数列表);”来调用父类中的成员方法。例如,Sector类的calArc()成员方法中的calPerimeter()方法来自父类Circle,而不是在Sector类中已重写过的calPerimeter()方法,所以用super关键字来表示区别。5.2 继承5.2.5 成员方法重写可以明显地看出,从父类Circle中直接继承过来的成员方法calPerimeter()和calArea()在子类Sector中已经不能履行其行为职责了。可以在子类中重新定义从父类中继承过来的成员方法,从而在子类中具有自己的行
10、为特征,以符合需求。这种成员方法重新定义称为成员方法重写(覆盖)。5.2 继承5.2.5 成员方法重写重写成员方法需要注意以下几个方面。(3)(1)(2)在子类中被重写的成员方法必须与父类中对应的成员方法有相同的方法名、参数列表、返回值类型和static修饰。只能扩大不能缩小重写后的成员方法的可见性(可见性从小到大为private、default、protected和public)。不能在子类中重写父类中用final关键字修饰的成员方法。用final关键字修饰的成员方法被称为最终方法。最终类中的方法都自动成为最终方法。5.3 多态5.3.1 认识多态在4.4节中提及的成员方法重载体现了同一个类
11、中方法的多态性。同一个类中所声明的多个重载方法为相似的功能提供了多种实现。Java编译系统根据参数的数量、类型和次序调用匹配的重载方法。这种多态可称为编译时多态。在继承过程中,子类继承了父类的所有成员。在确保可见性的前提下,凡父类对象能调用的成员,子类对象也能调用。子类还能重写父类中的成员方法。5.3 多态5.3.2 多态应用父类对象和子类对象之间的引用可以相互转换。父类对象引用了子类对象被称为向上转型。子类对象引用了父类对象被称为向下转型。5.3 多态5.3.2 多态应用向上转型的基本语法格式如下。1.向上转型父类型 引用变量名=new 子类构造方法名(实际参数列表);【例5-2】Circl
12、e类对象引用Sector类对象。文件名为Example5_2.java,其代码如下。5.3 多态5.3.2 多态应用1.向上转型【例5-2】运行结果如下。该扇形的半径为:5.0该扇形的周长为:11.7该扇形的面积为:4.4该扇形的半径为:10.0该扇形的周长为:23.5该扇形的面积为:17.55.3 多态5.3.2 多态应用1.向上转型向上转型的应用特点总结如下。(1)向上转型后的对象不能调用子类中新增的成员。(2)向上转型后的对象可以调用子类继承或重写的成员。(3)如果子类重写了父类的某个成员方法,那么向上转型后的对象调用该成员方法时,调用的必定是重写后的成员方法。5.3 多态5.3.2 多
13、态应用向下转型的基本语法格式如下。2.向下转型子类型 引用变量名=(子类型)new 父类构造方法名(实际参数列表);【例5-3】Sector类对象引用Circle类对象。文件名为Example5_3.java,其代码如下。5.3 多态5.3.2 多态应用2.向下转型【例5-3】上述代码能通过编译,但是在运行时会抛出ClassCastException异常。5.3 多态5.3.2 多态应用2.向下转型向下转型的应用特点总结如下。(1)单独一次向下转型编译能通过,但是运行时会抛出异常。(2)向上和向下两次转型后,所得到的对象是子类类型,可以按子类对象的运行方式操作子类及父类中的成员。(3)向下转型
14、必须进行强制类型转换。5.3 多态5.3.2 多态应用Java中引入了instanceof运算符用来判断引用变量是否为某类或其子类类型。instanceof 运算的语法格式为:3.instanceof 运算符引用变量名 instanceof 类名【例5-4】instanceof运算符的使用。文件名为Example5_4.java,其代码如下。如果引用变量是该类或其子类的对象,则运算结果为true;反之,则运算结果为false。5.3 多态5.3.2 多态应用3.instanceof 运算符【例5-4】运行结果如下。5.4 抽象类抽象类不能被实例化,即不能创建抽象类的对象,但是可以在抽象类中定义
15、构造方法,以及成员变(常)量和成员方法。包含抽象方法的类一定是抽象类,但是抽象类中可以没有抽象方法。抽象方法是指只有方法声明而没有具体化的方法。抽象类中的所有抽象方法必须在其非抽象子类中被重写以具体化,否则子类也必须声明为抽象类。5.4 抽象类定义抽象类的基本语法格式如下。定义抽象方法的基本语法格式如下。访问控制修饰符 abstract 返回值类型 方法名(形式参数列表);5.4 抽象类【例5-5】定义抽象类Polygon,在其中定义计算多边形周长和面积的抽象方法;再定义类Rectangle,代表矩形,继承抽象类Polygon,重写其计算多边形周长和面积的抽象方法,以求解矩形的周长和面积。首先
16、,定义抽象类Polygon。文件名为Polygon.java,其代码如下。见书本P112-113。然后,定义Rectangle类,可参照图5-3的操作选择父类Polygon。文件名为Rectangle.java,其代码如下。见书本P113-114。5.4 抽象类【例5-5】最后,编写一个测试类对子类Rectangle的功能进行检验。文件名为Example5_5.java,其代码如下。5.4 抽象类【例5-5】运行结果如下。长为7.0,宽为5.0的矩形周长为24.0长为7.0,宽为5.0的矩形面积为35.05.5 接口Java只支持单一继承,不支持多重继承。但是,有些情况下,只有单一继承是不够的
17、。例如,某两个类都有值得继承的成员,由于单一继承的限制,这种操作无法实现。Java中为了弥补单一继承所带来的缺陷,定义了接口机制以完善功能。接口规范了实现它的类所应具有的共同属性和行为。可以把接口看成更为严格的抽象类。接口中只能包含常量和抽象方法。定义接口的基本语法格式如下。5.5 接口interface关键字前面的修饰符用来进行访问控制,其只能是两种类型之一:public型默认型5.5 接口一个类只能继承一个父类,但是可以实现多个接口。一个类可以同时继承一个父类(抽象类)并实现多个接口。子类继承父类同时实现接口的基本语法格式如下。修饰符 abstract class 类名 extends 父
18、类 implements接口列表 /类体 其中,接口之间用“,”分隔。类如果没有重写接口或抽象父类中的全部抽象方法,则必须定义它为抽象类。5.5 接口【例5-6】定义接口Position,代表图形位置,提供设置及获取平面图形坐标的抽象方法。定义接口Surface,代表图形表面,提供设置及获取颜色的抽象方法。再定义子类Square,代表正方形,继承抽象类Polygon,重写其计算多边形周长和面积的抽象方法,以求解正方形的周长和面积;同时实现Position接口和Surface接口。首先,定义Position接口。在MyEclipse IDE中,右击myPro项目下src目录的ch5.exampl
19、e目录,在弹出的快捷菜单中执行“New”“Interface”命令,在弹出的“New Java Interface”窗口中输入接口名Position,如图5-5所示。5.5 接口【例5-6】图5-5 创建接口Position单击Finish按钮,完成接口Position的创建。文件名为Position.java,其代码如下。5.5 接口按同样步骤完成接口Surface的创建。文件名为Surface.java,其代码如下。5.5 接口然后定义子类Square。可参照图5-3所示的操作选择父类Polygon。再参照图5-2,单击Interface文本框右侧的Add按钮,打 开“Implemente
20、d Interfaces Selection”窗口,如图5-6所示。图5-6 选择Position接口5.5 接口在“Choose interfaces”文本框中输入接口名称Pos,在“Matching items”列表框中会显示相应路径下的Position接口,选择要实现的接口Position,单击OK按钮,返回“New Java Class”窗口。按同样的步骤选择要实现的接口Surface。此时,在Interfaces列表中出现了所要实现的接口Position和Surface,如图5-7所示。图5-7 完成子类Square的创建5.5 接口单击Finish按钮,完成子类Square的创建。
21、文件名为Square.java,其代码如下。见书本P119-121。最后,编写一个测试类对子类Square的功能进行检验。文件名为Example5_6.java,其代码如下。5.6 小结继承有效地实现了代码重用。Java中只允许单继承,即子类只能有一个直接父类。在子类中通过super关键字访问父类可见成员。子类构造方法必须继承父类中的某个构造方法。子类可以对所继承的父类成员方法进行重写。最终类不可被继承,最终方法不可被重写。父类对象和子类对象之间的相互引用呈现多态。父类对象引用了子类对象被称为向上转型,子类对象引用了父类对象被称为向下转型。可使用instanceof运算符判断引用变量为何种类型
22、。抽象类不能被实例化,继承抽象父类的非抽象子类必须重写抽象父类中所有的抽象方法。子类可以在继承父类的同时实现多个接口。接口只包含公开静态常量和公开抽象方法。5.7 习题1.下列代码能通过编译吗?如果不能通过编译,该如何修改?5.7 习题2.下列代码能运行吗?如果不能,说明原因。5.7 习题3.修改习题2中的A类和Test类,代码如下。修改后的代码能通过编译吗?为什么?4.定义接口Equation,代表方程。在其中定义抽象方法showResult(),显示方程的实数解。再定义类UQEquation,代表一元二次方程,实现Equation接口。5.8 上 机 实 践1.参照【例5-5】中的Rect
23、angle类,定义Square类,代表正方形,继承Rectangle类。2.参照模块4中习题4的Triangle类,定义ETriangle类,代表等边三角形,继承Triangle类。3.定义抽象类Vehicle,代表交通工具。在其中:封装必要的属性;定义相应的getter()和setter()方法;定义抽象方法run(),代表不同交通工具的行驶方式。再定义4个类Automobile、Train、Ship和Airplane,分别代表汽车、火车、轮船和飞机,继承Vehicle类。4.定义接口Shape,代表图形形状。在其中:定义抽象方法double calArea(double d),计算图形的面积。再定义2个类Circle和SSquare,分别代表圆和正方形,实现Shape接口。谢谢观看!