




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 Java面向对象的特征重点难点
成员的隐藏、重载与覆盖的知识
接口的声明与实现学习目标
掌握继承的概念
掌握成员变量的隐藏、成员方法的重载与覆盖
理解抽象类、最终类的概念及使用场合
掌握接口的相关知识
理解包的概念
了解Java的常用类库包7.1典型案例【案例描述】
使用Eclipse编写程序,定义一个Person类,该类包含姓名、年龄、性别三个属性,以及设置姓名、设置年龄、设置性别、显示信息四个成员方法。定义一个Student类,除了以上属性外,还要增加学号、专业两个属性,以及一个带参数的构造方法。设计一个测试类,定义对象,输出其信息,运行结果如图所示。【运行结果】7.2继承
继承(inheritance)是面向对象程序设计的又一个重要特性。继承体现了类与类之间的一种关系,即一般与特殊的关系。继承就是一种由现有的类创建新类的机制。继承机制使得新类不仅有被继承类的全部成员变量和方法,还可以根据需要增加自己特有的成员变量和方法。通过继承,可以从已有的类模块产生新的类模块,从而使两个类模块之间发生联系。7.2.1Java的继承机制
首先创建一个包括其他许多类共有的成员变量和方法的一般类,然后再通过继承创建一个或多个新类。由于继承,这些新类已经具有了一般类的成员变量和方法,此时只需再设计各新类特有的成员变量和方法。由继承而得到的新类称为子类(subclass),被继承的类称为父类或超类(superclass)。子类直接的上层父类称作直接父类。
继承有两种基本形式:多继承和单继承。Java语言只允许单继承,不允许多继承。但一个类允许同时拥有多个子类。7.2.2继承的实现
在类的声明语句中加入extends关键字和指定的类名即可实现类的继承。具体格式如下:[修饰符]class子类名extends父类名{
子类体}例如:classSub1extendsSuper{…
}
上例中定义了Sub1类继承Super类。此时称Sub1类是Super类的子类,或者说Super类是Sub1类的直接父类,直接父类通常简称“父类”。7.2.3成员的访问和继承1.成员变量的继承子类继承父类成员变量的具体继承原则如下:(1)如果子类与父类在同一个包中,子类能够继承父类中除了声明为private的成员变量以外的其他成员变量。(2)如果子类与父类不在同一个包中,子类能够继承父类中声明为public和protected的成员变量,不能继承父类中那些声明为private和缺省的成员变量。(3)如果子类声明一个与父类成员变量同名的成员变量,则子类不能继承父类的同名成员变量。此时称子类的成员变量隐藏了父类的同名成员变量。7.2.3成员的访问和继承2.成员方法的继承子类继承父类成员方法的原则类似于子类继承父类成员变量的原则,具体的继承原则如下:(1)如果子类与父类在同一个包中,子类能够继承父类中除了声明为private的成员方法以外的其他成员方法。(2)如果子类与父类不在同一个包中,子类能够继承父类中那些声明为public和protected的成员方法,不能继承父类中那些声明为private和缺省的成员方法。(3)如果子类方法与父类方法同名,则不能继承。此时称子类方法重写了父类中的同名方法。7.2.3成员的访问和继承3.构造方法的调用
父类构造方法的引用原则如下:(1)若父类定义了无参数的构造方法,则子类无条件地调用该构造方法。
(2)若子类未定义自己的构造方法,则在创建子类对象时,它将默认调用父类的无参数构造方法作为自己的构造方法。
(3)若子类定义了自己的构造方法,则在创建子类对象时,它将先执行其父类的无参数构造方法,然后再执行自己的构造方法。
(4)若父类定义了有参数的构造方法,则子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法中的第一条可执行语句。7.3多态
多态是面向对象程序设计的重要特性,简单点说就是“一个接口,多种实现”,是指同一种事物表现出多种形态。编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,指把一系列具体事物的共同点抽象出来,再通过这个抽象的事物,与不同的具体事物进行对话。7.3.1多态的作用
多态是指一个方法只能有一个名称,但可以有许多形态,也就是说程序中可以定义多个同名的方法。(1)可替换性(substitutability)。(2)可扩充性(extensibility)(3)接口性(interfaceability)(4)灵活性(flexibility)(5)简化性(simplicity)7.3.2成员变量的隐藏
变量的隐藏就是指在子类中定义的变量和父类中定义的变量有相同的名字,或方法中定义的变量和本类中定义的变量同名。在这种情况下,系统采用局部优先的原则。
若子类声明了与父类同名的变量,则父类的变量被隐藏起来,直接使用的是子类的变量,但父类的变量仍占据空间,可通过super关键字来访问。
7.3.3成员方法的重写
在Java中,子类可以继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想做一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
如果在子类中命名一个方法,这个方法与父类中的某方法具有相同的方法名、相同的参数列表、相同的返回值和修饰符,说明子类重写了父类的方法。子类的对象使用这个方法时,将调用子类中定义的方法,父类中的定义如同被“屏蔽”了。如需调用父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。7.3.4成员方法的重载在Java中,同一个类中的两个或两个以上的方法可以有相同的名字,只要它们的参数声明不同即可。这种情况被称为成员方法的重载(overloaded)。方法重载是Java实现多态的一种方式。当一个重载方法被调用时,Java通过参数的类型和(或)数量来判断实际调用的是哪个重载方法。因此,每个重载方法的参数类型和(或)数量必须是不同的。虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法时,参数与调用参数匹配的方法被执行。7.3.4成员方法的重载项目方法重载方法重写(覆盖)类的层次针对同一个类中的同名方法针对父类与子类中的同名方法方法名称各重载方法的名称必须完全相同被继承与继承的方法名称必须完全相同返回值类型各重载方法的返回值的类型必须完全相同被继承与继承的方法的返回值的类型必须完全相同参数类型各重载方法的参数类型必须不同被继承与继承方法的参数类型必须完全相同参数数目各重载方法的参数数目必须不同被继承与继承的方法的参数数目必须完全相同7.4抽象类和最终类7.4.1抽象类与抽象方法
类是对现实世界中实体的抽象,但我们不能以相同的方法为现实世界中所有的实体做模型,因为现实世界中大多数的类太抽象而不能独立存在。定义抽象类的一般格式如下:[访问控制符]abstractclass类名{//属性说明
//抽象方法声明//非抽象方法定义
……}7.4.1抽象类与抽象方法
类中允许定义抽象方法。所谓抽象方法,是指在类中仅仅声明了类的行为,并没有真正实现行为的代码,即只有方法头、没有方法体的方法。
声明抽象方法的一般格式如下:[访问控制符]abstract数据类型方法名([参数表]);例如:abstractvoiddraw();//声明类中的draw()方法为抽象方法7.4.2最终类与最终方法
最终类是指不能被继承的类,即最终类没有子类。在Java语言中,如果不希望某个类被继承,可以声明这个类为最终类。最终类用关键字final来说明。
如果没有必要创建最终类,而又想保护类中的一些方法不被覆盖,可以用关键字final来指明那些不能被子类覆盖的方法,这些方法称为最终方法。例如:publicclassA{publicfinalvoidf();}
7.5接口7.5.1接口的概念为了弥补Java语言只支持类间单继承的缺点,Java语言引入了接口(interface)机制,以此来实现类间多重继承功能。
接口是Java语言的特点之一,在Java中可以把接口看作是一种特殊的抽象类,它只包含常量和抽象方法的定义,而没有变量和方法的实现,它用来表明一个类必须做什么,而不去规定它如何做,因此我们可以通过接口表明多个类需要实现的方法。由于接口中没有具体的实施细节,也就没有和存储空间的关联,所以可以将多个接口合并起来,由此来达到多重继承的目的。7.5.2接口的定义与类的结构相似,接口也分为接口声明和接口体两部分。定义接口的一般格式如下:[public]interface接口名[extends父接口名列表{//接口体开始//常量数据成员的定义
数据类型常量名=常数值;
……//抽象方法的声明
返回值类型方法名([参数列表])[throw异常列表];
……} //接口体结束7.5.2接口的定义说明如下:(1)接口的访问权限只有public和缺省类型。(2)interface是声明接口的关键字,与class类似。(3)接口的命名必须符合标识符的规定,并且接口名必须与文件名相同。(4)允许接口的多重继承,通过“extends父接口名列表”可以继承多个接口。(5)对接口体中定义的常量,系统默认为是staticfinal修饰的,不需要指定。7.5.3接口的实现
接口的实现,即在实现接口的类中重写接口中定义的所有方法,书写方法体代码,完成方法所规定的功能。
定义实现接口类的一般格式如下:[访问控制符][修饰符]class类名[extends父类名]implements接口名列表{[类的成员变量说明] //属性说明[类的成员方法定义][类的构造方法定义] //行为定义/*重写接口方法*/
接口方法定义 //实现接口方法} //类体结束标志7.6包7.6.1包的概念Java语言提供了把类名空间划分为容易管理的块的机制,该机制就是包(package)。包作为Java语言的特点之一,既是一种命名机制,也是一种可见度控制机制。可以在包内定义类,而且在包外不能访问该类。
Java语言中的包意指目录中一组相关的“.class”文件的集合,也可以说包就是文件夹,其作用是更好地管理Java类和接口。从另一个角度看,包就是类的容器,用来保存划分的类名空间。例如,一个包允许用户创建一个名为Counter的类,用户可以把它保存在自己的包中而不用考虑和其他地方的某个名为Counter的类相冲突。7.6.1包的概念为了区别于各种平台,Java语言中采用点号(.)来分隔目录。使用包不仅可以避免名字的冲突,还可以将大量的类按照功能和用途组织起来,使访问和查找变得更加方便,从而提供一定的访问控制。类、方法和域的默认访问权限是可以在声明它的包中被访问。7.6.2包的创建
在Java语言中创建一个包的步骤很简单,即通过关键字package来声明包。其格式如下:package包名;package语句作为Java源文件的第1条非空格、非注释语句,指明该源文件定义的类所在的包。如果在源文件中省略了package语句,则源文件中用户定义命名的类被隐含地认为是无名包的一部分,即源文件中用户定义命名的类在同一个包中,但该包没有名字。尽管默认包对于规模较小的程序很好用,但对于实际的中、大型应用程序,显然它是不适用的。多数情况下,我们需要为自己的代码定义一个包。7.6.3包的引用
创建了一个包之后,就要对它进行引用。一般来说,可使用import语句导入包中的类。其一般格式如下:import包名.*; //可以使用包中所有的类或
import包名.类名; //只导入包中指定类名的类
在程序中,import语句应放在package语句之后,如果没有package语句,则import语句应放在程序开始处。一个程序中可以含有多个import语句,即在一个类中,可以根据需要引用多个包中的类。7.6.4常用的Java类库包1.java.lang包
Java语言的核心包,它有Java程序所需要的最基本的类与接口,java.lang
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论