《第5章继承与多态 Java程序设计及应用.ppt》由会员分享,可在线阅读,更多相关《第5章继承与多态 Java程序设计及应用.ppt(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5章章 继承与多态继承与多态 5.1 类的封装类的封装 5.2 类的继承类的继承 5.3 多态机制多态机制 5.4 接口接口 5.5 包包 5.6 内部类内部类 5.7 本章小结本章小结 Java程程序序设设计计的的基基本本单单位位是是类类。类类是是用用来来创创建建对对象象的的模模版版,它它除除了了把把数数据据和和对对数数据据的的操操作作封封装装成成一一个个整整体体外外,还还有有另另外外两两个个重重要要的的特特性性:继继承承和和多多态态。本本章章的的主主要要内内容容就就是是介介绍绍了了类类的的封封装装、类类的的继继承承和和与与继继承承有有关关的多态性、接口及包等重要概念。的多态性、接口及包
2、等重要概念。12/31/20221第第5章章 继承与多态继承与多态第5章 继承与多态 Java Java 语语言言与与其其他他面面向向对对象象语语言言一一样样,引引入入了了类类的的概概念念。JavaJava程程序序设设计计的的基基本本单单位位是是类类。类类是是用用来来创创建建对对象象的的模模版版,它它包包含含被被创创建建的的对对象象的的属属性性和和功功能能。类类有有两两种种基基本本的的成成员员:变变量量和和方方法法,变变量量用用来来描描述述对对象象的的属属性性,方方法法用用来来实实现现对对象象的的功功能能。类类除除了了把把数数据据和和对对数数据据的的操操作作封封装装成成一一个个整整体体外外,还
3、还有有另另外外两两个个重重要要的的特特性性:继继承承和和多多态态。通通过过子子类类可可以以实实现现继继承承。继继承承是是软软件件复复用用的的一一种种形形式式,子子类类由由已已存存在在的的父父类类生生成成,子子类类继继承承父父类类的的属属性性和和功功能能,并并且且根根据据需需要要对对原原有有的的属属性性和和功功能能加加以以修修改改或或添添加加新新的的属属性性和和功功能能。而而多多态态是是同同一一个个消消息息可可以以根根据据发发送送消消息息对对象象的的不不同同产产生生多多种种不不同同的的行行为为方方式式。JavaJava通通过过方方法法重重写写、方方法法重重载载和和接接口口来来实实现现多多态态。本
4、本章章的的主主要要内内容容就就是是介介绍绍了了类类的的封封装装、类类的的继继承承和和与与继继承承有有关关的的多多态态性以及接口等重要概念。性以及接口等重要概念。12/31/20222第第5章章 继承与多态继承与多态第5章 继承与多态5.1类的封装封装(Encapsulation)是将代码及其处理的数据绑定在一起的一种编程机制。这种机制保证了程序和数据都不受外部干扰且不被误用 JavaJava封装的基本单元是类。封装的基本单元是类。可以阻止外部定义的代码随意访问内部代码和数据可以阻止外部定义的代码随意访问内部代码和数据 使类或模块的可重用性大为提高使类或模块的可重用性大为提高 访问权限指本类中的
5、成员可以被哪些类访问privateprivate私有的私有的ProtectedProtected保护的保护的PublicPublic公共的公共的友好友好12/31/20223第第5章章 继承与多态继承与多态第5章 继承与多态5.1类的封装类的封装封装(封装(EncapsulationEncapsulation)是将代码及其处理的数据绑定在一起的一种编程机制是将代码及其处理的数据绑定在一起的一种编程机制。JavaJava封装的基本单元是类。封装的基本单元是类。可以阻止外部定义的代码随意访问内部代码和数据可以阻止外部定义的代码随意访问内部代码和数据 使类或模块的可重用性大为提高使类或模块的可重用性
6、大为提高 需要注意的是,既然类的目的是封装复杂性,在类的内部就应该有隐蔽实现复杂性机制。类中的每个方法或变量都可以被标记为私有(private)或公有(public)。类的公共接口代表类的外部用户需要知道或可以知道的每件事情;私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有的方法或变量。既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,就可以保证不希望发生的事情就一定不会发生。当然,公共接口应该小心仔细设计,不要过多暴露类的内部内容。12/31/20224第第5章章 继承与多态继承与多态5.1类的封装访问权限访问权限指本类中的成员可以被哪些类访问
7、。类有两种重要的成员:成员变量和方访问权限指本类中的成员可以被哪些类访问。类有两种重要的成员:成员变量和方法。这种访问权限控制实现了一定范围内的信息隐藏。法。这种访问权限控制实现了一定范围内的信息隐藏。privateprivate私有的私有的ProtectedProtected保护的保护的PublicPublic公共的公共的FriendlyFriendly友好的友好的表表5.1不同范围的访问权限比较不同范围的访问权限比较被本类访问被本类访问被子类访问被子类访问被同一包中的被同一包中的其他类访问其他类访问被所有类访问被所有类访问 private允许不允许不允许不允许protected允许允许允许
8、不允许public允许允许允许允许友好允许不允许允许不允许12/31/20225第第5章章 继承与多态继承与多态5.1.2 访问权限私有的(private)privateprivateVar;privateprivateMethod(paramlist)用关键字Private修饰的成员变量和方法被称为私有变量和私有方法类中限定为private的成员变量和方法只能被这个类本身的方法访问,不能在类外通过名字来访问。(例5-1)对于私有成员变量和方法,只有在本类中创建该类的对象时,这个对象才能够访问自己的私有变量和类中的私有方法。(例5-2)同一个类的不同对象可以访问对方的private成员变量或调
9、用对方的private方法,这是因为访问保护是控制在类的级别上,而不是对象的级别上。另外,对于构造方法,我们也可以限定它为private。如果一个类的构造方法声明为private,则其他类不能生成该类的一个实例。12/31/20226第第5章章 继承与多态继承与多态5.1.2 访问权限保护的(protected)protectedprotectedVar;protectedprotectedMethod(paramlist)用protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法。类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中以及不同包中的子类
10、)以及同一个包中所有其他的类访问。如果一个类有子类,如果都想让子类能够访问自己的某些成员,而不管子类是否与自己在同一个包中,就应该将这些成员声明为private访问类型。当然也可以将其声明为public。但这样一来,所有的类都能访问,这并不是所希望的。另外,处在不同包中的子类虽然可以访问父类中限定为protected的成员,但这时访问这些成员的对象必须具有子类的类型或者是子类的子类的类型,而不能是父类类型。12/31/20227第第5章章 继承与多态继承与多态5.1.2 访问权限公共的(public)publicpublicVar;publicPublicMethod(paramlist)用p
11、ublic修饰的成员变量和方法被称为共有变量和共有方法。类中限定为public的成员可以被所有的类访问。public方法的主要用途是让类的客户了解类提供的服务,即类的公共接口,而不必关心类是如何完成其任务的。友好的(friendly)如果在成员变量和方法前不加任何访问权限修饰符,即指明它的访问权限为“friendly”。它是缺省情况。类中限定为“friendly”的成员可以被这个类本身和同一个包中的类所访问。但对包外的所有类就不能访问。在源文件中编写命名的类总是在同一包中的。如果源文件使用import语句引入了另外一个包中的类,并用该类创建了一个对象,那么该类的这个对象将不能访问自己的友好变量
12、和友好方法。12/31/20228第第5章章 继承与多态继承与多态第五章 继承与多态5.2 类的继承继承的概念继承(Inheritance)是一个对象获得另一个对象的属性的过程创建子类通过在类的声明中加入extends子句来创建一个类的子类this与superJava中,this用来引用当前对象,与this类似,super用来引用当前对象的父类继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。Java中,所有的类都是通过直接或间接地继承java.lan
13、g.Object得到的。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。子类继承父类的状态和行为,同时也可以修改父类的状态或重载父类的行为,并添加新的状态和行为,Java中不支持多重继承。12/31/20229第第5章章 继承与多态继承与多态5.2.1 继承的概念继承(Inheritance)是一个对象获得另一个对象的属性的过程。继承支持了按层分类的概念。大多数知识都可以按层级(即从上到下)分类管理。通常来讲,类的继承性一个就是新的子类可以从另一个父类派生出来,并自动拥有父类的全部属性和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。子类继
14、承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。java是单继承机制,不支持多重继承是单继承机制,不支持多重继承,即一个父类可以有多个子类,单一个子类只能有一个父类。这种单继承使代码更加可靠,不会出现因多个父类有相同的方法或属性所带来的麻烦。在Java中所有类都是java.lang.Object的子类或子孙类。12/31/202210第第5章章 继承与多态继承与多态5.2.1 继承的概念继承的规则继承的规则子类继承那些被声明为public或protected的父类成员(包括成员变量和成员方法,下同);(默认的存取权限为frien
15、dly)子类继承那些未被存取权限修饰符修饰的父类成员,只要该子类与父类在同一个包中;如果子类声明了一个与父类中的成员同名的成员,则子类不继承父类中的该同名成员,即不继承那些被隐藏的成员变量或被重写的成员方法;子类不继承被修饰为private的父类成员。12/31/202211第第5章章 继承与多态继承与多态5.2.2 创建子类通过在类的声明中加入extends子句来创建一个类的子类,其格式如下:class 子类名 extends 父类名 如果缺省extends子句,则该类为java.lang.Object的子类。例如:class Dog extenda Animal.子类可以继承父类中访问权限
16、设定为public、protected、friendly的成员变量和方法。子类从它的父类中继承了所有的成员变量和方法,但父类中有些成员变量和方法子类不能继承。12/31/202212第第5章章 继承与多态继承与多态5.2.2 创建子类 子类继承父类的规则子类能够继承父类中Public和Protected;子类能够继承父类中没有访问控制的成员,只要子类和父类在同一个包内;子类不能继承父类隐藏的成员变量和重写的父类方法;子类不能继承父类中的Private成员;子类不能继承父类中的构造方法,因为构造方法不是类的成员。12/31/202213第第5章章 继承与多态继承与多态5.2.3 this与sup
17、er子类在隐藏了父类的成员变量或重写了父类的方法后,常常还要用到父类的成员变量,或在重写的方法中使用父类中被重写的方法以简化代码的编写,这时就要访问父类的成员变量或调用父类的方法,Java中通过super来实现对父类成员的访问。Java中,this用来引用当前对象,与this类似,super用来引用当前对象的父类。关键字this和super分别用来指明子类和父类中同名的成员变量或成员方法当父类的成员变量、子类的成员变量和类中方法使用的局部变量三者同名,或其中的两者同名时,可以使用关键字this和super来指定所要使用的变量。12/31/202214第第5章章 继承与多态继承与多态5.2.3
18、this与super Thisthis可以出现在实例方法和构造方法中,但不可以出现在类方法中。这是因为类方法可以通过类名直接调用,这时可能还没有任何对象诞生。在构造方法中使用在构造方法中使用this关键字关键字 this可以出现在类的构造方法中,代表使用该构可以出现在类的构造方法中,代表使用该构造方法所创建的对象。(造方法所创建的对象。(例例5-3)在实例方法中使用在实例方法中使用this 关键字关键字this可以出现在类的实例方法中,代表使用该方法可以出现在类的实例方法中,代表使用该方法的当前对象。实例方法可以操作成员变量。当成员变量的当前对象。实例方法可以操作成员变量。当成员变量在实例中出
19、现时,默认的格式是:在实例中出现时,默认的格式是:this.成员变量;意思成员变量;意思是当前对象的成员变量是当前对象的成员变量 12/31/202215第第5章章 继承与多态继承与多态5.2.3 this与super Supersuper的使用有三种情况 用来访问父类被隐藏的成员变量,如:super.成员变量;用来调用父类中被重写的方法,如:super.方法(参数列表t);用来调用父类的构造方法,如:super(参数列表);(例5-4,例5-5)12/31/202216第第5章章 继承与多态继承与多态5.3 多态机制5.3多态机制多态性(Polymorphism)是指同名的不同方法在程序中共
20、存。即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法,系统就会根据不同的情况,调用相应的不同方法,系统会根据不同情况,调用相应的不同功能。多态又被称为“一个名字,多个方法”。方法的重载(overload)一个类中可以有多个具有相同名字的方法,由传递给它们的不同个数和类型的参数来决定使用哪种方法构造方法重载构造方法的重载是指同一个类中定义不同参数的多个构造方法,以完成不同情况下对象的初始化。方法的覆盖(override)子类可以重新实现父类的某些方法,使其具有自己的特征。12/31/202217第第5章章 继承与多态继承与多态5.3.1 方法重载方法重载必须
21、满足的条件方法名相同方法的参数类型、个数、顺序至少有一项不相同。方法的返回类型可以不相同。方法的修饰符可以不相同。(例5-6-1,例5-6-2)12/31/202218第第5章章 继承与多态继承与多态5.3.1 方法的重载前面已经指出,通过方法重载是Java实现多态的一种方式。所谓功能多态性,是指可以向功能传递不同的消息,以便让对象根据相应的消息来产生一定的行为。对象的功能通过类中的方法来体现,那么功能的多态就是方法的重载。方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。通过重载可定义多种同类的操作方法,调用时根据不同需要选择不同的操
22、作。方法的返回类型和参数的名字不参与比较,也就是说,如果两个方法的名字相同,即使类型不同,也必须保证参数的不同。重载方法必须满足以下条件:(1)方法名相同。(2)方法的参数类型、个数、顺序至少有一项不相同。(3)方法的返回类型可以不相同。(4)方法的修饰符可以不相同。12/31/202219第第5章章 继承与多态继承与多态5.3.1 方法的重载在一个类中不允许定义两个方法名相同,并且参数签名也完全相同的方法。因为假如存在这样的两个方法,Java虚拟机在运行时就无法决定到底执行哪个方法。参数签名是指参数的类型、个数和顺序。编译器根据参数的个数和类型来决定当前所使用的方法。注意,如果两个方法的声明
23、中,参数的类型和个数均相同,只是返回类型不同,则编译时会产生错误,即返回类型不能用来区分重写的方法。方法重载归纳方法重载是java实现面向对象多态性机制的一种方式。在一个类中多个方法名称相同,但参数列表不同(个数和类型不同),这个情况构成方法重载返回类型不同,不足以构成方法的重载当重载方法被调用时,编译器根据参数类型和数量来确定实际调用哪个重载方法的版本java中不允许在一个类中声明2个识别标记相同的方法这两种方法的识别标记是相同的,虽然形参的变量名不同,但还是不足以构成方法重载。12/31/202220第第5章章 继承与多态继承与多态5.3.2 构造方法重载除了重载正常的方法外,构造方法也能
24、够重载。实际上,对于大多数所创建的实现的类,重载构造方法是很常见的,并不是什么例外。构造方法的重载是指同一个类中定义不同参数的多个构造方法,以完成不同情况下对象的初始化。(例5-7,例5-8)12/31/202221第第5章章 继承与多态继承与多态5.3.3 方法的覆盖子类可以隐藏已继承的方法,子类通过方法覆盖来隐藏继承的方法。方法覆盖是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。子类通过方法的覆盖可以隐藏继承的方法,子类通过方法的覆盖可以把父类的状态和行为改变为自身的状态和行为。如果父类的方法可以被子类继承,子类就有权力重新改写该方法,从而
25、也就隐藏了继承的该方法,那么子类对象调用时一定是重写的方法。简单地说,方法的覆盖就是子类重定义从父类继承来的一个同名方法,此时子类将清除父类方法的影响。子类可以通过重新定义与父类同名的方法,实现自身的行为。方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。例5-912/31/202222第第5章章 继承与多态继承与多态5.3.3 方法的覆盖在方法的覆盖中,需要注意的问题:子类 重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回类型和参数列表,否则就不是方法的覆盖。这时有两种情况:是子类在准备覆盖继承的方
26、法时,参数个数及其类型同父类的方法完全相同,而没有保证方法的类型也相同,那实际上就没有隐藏继承的方法。这时就出现两个方法具有相同的名字,但没有保证参数的不同,程序就出现编译错误。(例5-10)如果子类在准备覆盖继承的方法时,参数个数或参数类型与父类的方法不尽相同,实际上也没有隐藏继承的方法,这时子类就出现两个方法具有相同的名字,但保证了参数的不同,也就是说子类出现了重载的方法,即有两个方法的名字相同,但参数不同。(例5-11-1,例5-11-2)12/31/202223第第5章章 继承与多态继承与多态5.3.3 方法的覆盖方法覆盖中需要注意的问题0父类的静态方法不能被子类覆盖为非静态方法。0子
27、类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。在编译时,子类定义的静态方法也必须满足与方法覆盖类似的约束:方法的参数个数及类型一致,返回类型一致,不能缩小父类方法的访问权限,不能抛出更多的异常。0父类的非静态方法不能被子类覆盖为静态方法。0父类的私有方法不能被子类覆盖。0父类的抽象方法可以被子类通过两种途径覆盖:一是子类实现父类的抽象方法;二是子类重新声明父类的抽象方法。12/31/202224第第5章章 继承与多态继承与多态5.4 接口接口是用来实现类间多重继承功能的一种结构,是相对独立的完成特定功能的属性集合。凡是需要实现这种特定功能的类,都可以继承并使用它。J
28、ava通过接口使得处于不同层次,甚至互不相关的类可以具有相同的行为。接口就是方法定义和常量值的集合。接口中定义的方法都是抽象方法,即只有方法的声明,没有方法的实现,实现接口的类要实现接口中的所有方法。它的用处主要体现在下面几个方面:通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互界面,而不需了解对象所对应的类。与C+不同,Java不支持多重继承,而是用接口实现比多重继承更强的功能一个类只能有一个父类,但可以同时实现若干个接口。利用接口实际上就获得了许多个特殊父类,即实现了多继承。所以,接口的作用是用来提供实现
29、类间多重继承功能的结构。12/31/202225第第1章章 外设概述外设概述5.4.1 接口的定义5.4.1接口的定义用关键字interface来定义一个接口,接口的定义和类的定义很相似,分为接口的声明和接口体两部分,格式如下:interface接口的名字接口体12/31/202226第第5章章 继承与多态继承与多态5.4.1 接口的定义接口声明:接口声明中还可以包括对接口的访问权限以及它的父接口列表。完整的接口声明如下:publicinterface接口名extends父接口名表其中public指明任意类和接口均可以使用这个接口,缺省情况下,只有与该接口定义在同一个包中的类和接口才可以访问这
30、个接口。extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有的常量和方法。12/31/202227第第5章章 继承与多态继承与多态5.4.1 接口的定义接口体接口体中包含常量定义和方法定义两部分。接口体中只进行方法的声明,不允许提供方法的实现,所以方法的定义没有方法体。常量定义的格式为:typeNAME=value;方法定义的格式为:returnTypemethodName(paramlist);另外,如果在子接口中定义了和父接口同名的常量或相同的方法,则父接口中的常量被隐藏,方法被重载既然接口里
31、只有抽象方法,它只要声明而不用定义处理方式,于是我们自然可以联想到接口也没有办法像一般类一样,用new运算符直接产生对象。相反地,我们必须利用接口的特性来打造一个新的类,在用它来创建对象。利用接口打造新的类的过程,我们称之为接口的实现。12/31/202228第第5章章 继承与多态继承与多态5.4.2 接口的实现在类的声明中用implements子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分隔。一个包括implements子句的类的一般形式如下:访问类型class类名extends超
32、类名implements接口名称/类体在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致。(例5-12)12/31/202229第第5章章 继承与多态继承与多态5.5 包由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。包实际上提供了一种命名机制和可见性限制机制。包的定义包的引用文档制作及API文档12/31/202230第第5章章 继承与多态继承与多态5.5 包创建包的基本方法定义public类;首句加“package包名”;将Java文件生成的Class放在以包名为目录名的目录中;
33、在其它程序中用“import包名”就可以存取此包中的所有Public类。12/31/202231第第5章章 继承与多态继承与多态5.5 包的定义包(package)是一组相关类和接口的集合或者说是类和接口的容器。它提供了访问权限(控制类之间的访问)和命名的管理机制(划分类名空间)。Java中包的作用是使得功能相关的类易于查找和使用-同一包中的类和接口通常是功能相关的;是避免了命名的冲突-不同包中的不同类可以同名;是提供一种访问权限的控制机制-一些访问权限以包为访问范围。12/31/202232第第5章章 继承与多态继承与多态5.5.1 包的定义 创建包只需在定义了类和接口的源文件的第一行使用p
34、ackage语句。package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:packagepkg1.pkg2.pkg3;不同的程序文件内的类也可以同属于一个包,只要在这些程序文件前都加上同一个包的说明即可。Java编译器把包对应于文件系统的目录管理。包层次的根目录是由环境变量CLASSPATH来确定的12/31/202233第第5章章 继承与多态继承与多态5.5.2 包的引用将类和接口组织成包的目的是为了能够更有效地使用包中的类。为了能使用Java中已提供的类,我们需要用import语句来引入所需要的类。import语句的格式
35、为:importpackage1.package2.(classname|*);其中package1.package2表明包的层次,与package语句相同,它对应于文件目录,classname则指明所要引入的类,如果要从一个包中引入多个类,则可以用星号(*)来代替。Java编译器为所有程序自动引入包java.lang,因此不必用import语句引入它包含的所有的类,但是若需要使用其他包中的类,必须用import语句引入另外,在Java程序中使用类的地方,都可以指明包含它的包,这时就不必用import语句引入该类了12/31/202234第第5章章 继承与多态继承与多态5.5.2 包的引用引用
36、包的方法总结12/31/202235第第5章章 继承与多态继承与多态5.5.2 包的引用在要引用的类名前带上包名作为修饰符。:Animals.Catcat=newAnimals.Cat();其中Animals是包名,Cat是包中的类,cat是类的对象。12/31/202236第第5章章 继承与多态继承与多态5.5.2 包的引用在文件开头使用import引用包中的类。如:importAnimals.Cat;classCheckCatcat=newCat();同样Animals是包名,Cat是包中的类,cat是创建的Cat类对象。12/31/202237第第5章章 继承与多态继承与多态5.5.2
37、包的引用在文件前使用import引用整个包。importAnimals.*;classCheckCatcat=newCat();Dogdog=newDog();.Animals整个包被引入,Cat和Dog为包中的类,cat和dog为对应类的对象。在使用包时,可以用点“.”表示出包所在的层次结构,如我们经常使用的:importjava.io.*;importjava.applet.*;实际是引入了/java/io/或/java/applet/这样的目录结构下的所有内容。12/31/202238第第5章章 继承与多态继承与多态5.5.2 文档制作及API文档Java程序员都应该知道使用JDK开发,
38、最好的帮助信息就来自SUN发布的Java文档。它分包、分类详细的提供了各方法、属性的帮助信息,具有详细的类树信息、索引信息等,并提供了许多相关类之间的关系,如继承、实现接口、引用等Java有两类注释:代码实现注释和文档性注释。Java为此提供了一种实现此功能的工具Javadoc。Java文挡实际上也是Java编程中非常重要的一个概念,Java文档实际上就相当于Java程序的帮助文档12/31/202239第第5章章 继承与多态继承与多态5.5.2文档制作及API文档在这个Java程序里,使用了Javadoc标记、文本等。Javadoc标记以“/*”开始,表明这些都是Java代码的注释。以“”开
39、始的标记就是Javadoc标记。在Java源程序里正确使用Javadoc标记是非常必要的注释习惯,将有助于Javadoc自动以源代码文件生成完整的格式化API文档。使用SDK提供的javadoc.exe可以制作源文件类结构的HTML格式文档。使用javadoc编译.java源文件时,它会读出.java源文件中的文档注释,并按照一定的规则与Java源程序一起进行编译,生成文档。javadoc命令格式如下:javadoc-d文档存放目录-author-version源文件名.java这条命令编译一个名为“源文件名.java”的java源文件,并将生成的文档存放在“文档存放目录”指定的目录下,生成的
40、文档中index.html就是文档的首页。-author和-version两个选项可以省略。12/31/202240第第5章章 继承与多态继承与多态5.5.2文档制作及API文档Javadoc标记的一些详细说明author指定生成文档中的“作者”项,可以指定多个author。在左面的代码中,author后面还加了一个HTML标记,用来链接URL。都是HTML标记,则是HTML注释。version指定版本信息。see标记是比较复杂的。seestring为“string”添加文本项,不产生任何链接。seeLabel使用HTML标记产生链接。seepackage.class#memberLabel。
41、param标记用来描述参数。return标记用来描述返回值。link为内联标记,内联标记的通常格式是:?linkpackage.class#memberlabel?提示:Label是位于注释中间的文本,package.class#member指向一个具体的类或者方法。以下是一些例子:链接到同一类的属性,使用:link#KEY链接到同一类的方法,使用:?link#getComponentAt?int?getComponentAt链接到其它类,使用linkjava.util.MapMap12/31/202241第第5章章 继承与多态继承与多态5.6 内部类内部类(InnerClass)是定义在其他
42、类中的类,主要作用是将逻辑上相关联的类放在一起。在解决一个复杂问题时,可能希望创建一个类,用来辅助自己的程序方案,但同时又不愿意它公开,内部类则可以实现这一点。内部类经常用于GUI事件处理。在JDK1.1之前,Java语言不支持在类中再嵌套定义类,类只能是包的成员,而不能是类的成员。从JDKl.1之后,引入了Innerclass的概念,允许在一个类的内部嵌套定义类。InnerClass可以是其他类的成员,也可以在一个语句块的内部定义,还可以在一个表达式内部匿名定义。包含内部类的类称为外部类(或外嵌类)。内部类不能与外部类同名。内部类与类中的成员变量和方法一样是外部类的成员,所以它可以不受限制地
43、访问外部类的成员变量和方法,即使这些成员是private的。因此这也是内部类所带来的一个好处,它可以更好地为外部类服务。(例5-13)当内部类的成员变量或参数与外部类的成员变量同名时,需要借助this关键字引用同名的成员。(例5-14)12/31/202242第第5章章 继承与多态继承与多态5.6 内部类InnerClass的特性Innerclass一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。Innerclass的名字不能与包含它的类名相同。Innerclass可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。Innerclass可以定义为abstr
44、act的。Innerclass可以声明为private或protected。Innerclass若被声明为static,就变成了顶层类,就不能再使用局部变量。Innerclass中的成员不能声明为static的,只有在顶层类中才可声明static成员。如果想在Innerclass中声明任何static成员,则该Innerclass必须声明为static的。12/31/202243第第5章章 继承与多态继承与多态5.6 内部类关于内部类应该了解以下几个方面内部类是个独立的个体,与外部类无关。内部类可以操作外部类中所有的成员方法和成员变量,包括private修饰过的。生成内部类的字节码文件,格式是
45、:外部类名$内部类名。当外部类、内部类、内部类方法中都包含同一字段或方法时,当方法调用那个字段或方法,首先调用的是方法中的字段,如果想调用类中的字段,可以用:this.字段名,如果想调用外部类中的字段,可以用:outer.this.字段名。如果需要声明内部类,可以在外部类定义一个返回内部类对象的方法来实现,也可以在新类中,先new()一个外部类对象,然后再通过“outer.inner()”去实现声明外部类变量,注意不能直接用new去声明内部类,也不能在外部类中,直接定义内部类对象。不管内部类嵌套多深,都可以去访问外部类的对象(变量和方法)。12/31/202244第第5章章 继承与多态继承与多
46、态5.6 内部类例一Java1.1以后版本添加了嵌套类(Inner Class,嵌套类、内部类)。嵌套类定义在类(外部类)里面。嵌套类可以体现逻辑上的从属关系。同时对于其他类可以控制内部类不可见等。外部类的成员变量作用域是整个外部类,包括嵌套类。但外部类不能访问嵌套类的private成员。例二下面演示了如何在外部类之外实例出一个public Inner类对象。类名前加上外部类类名,new语句前加上外部类的引用变量。这很类似package的使用。12/31/202245第第5章章 继承与多态继承与多态5.6 内部类例三当内部类与外部类有同名变量时,缺省指本类中的变量。例四在方法中定义一个嵌套类,
47、注意嵌套类不可以访问方法的局部变量。因为方法的局部变量只存在与方法作用期间,故localvalue不可访问。而final变量的生命周期超出了方法,所以fianlvalue可用。12/31/202246第第5章章 继承与多态继承与多态5.6 内部类例五嵌套类的类名必须与包装它的外部类区别,且嵌套类的类名仅仅可以作用于定义范围中。方法中定义类,其类名名就只能出现在方法中。定义在方法中的嵌套类只能使用定义为final的局部变量,不可以使用方法中的非静态变量。嵌套类可以使用的变量种类包括:类变量、实例变量、final局部变量。嵌套类同样具有所有的访问控制权限。高级类属性:嵌套类可以是abstract类
48、。12/31/202247第第5章章 继承与多态继承与多态5.7 本章小结本章讨论了面向对象程序设计的两个最为重要的特点:继承和多态。在Java中类类(class)class)是用来代表对象的基本单元。对象对象(object)object)可以是现实世界中的任何一个实体,它具有若干区别于其它对象的属性和操作。而类则通过为对象定义属性和操作来概括一类实体。它封装了一组变量和方法,是生成实例对象时的模板。可以说类是对象的抽象,对象是类的实例化。继承继承是面向对象程序设计方法中的一种重要手段,通过继承可以更有效地组织程序结构,明确类间关系,并充分利用已有的类来创建新类,以完成更复杂的设计、开发。多态
49、多态则可以统一多个相关类对外的接口,并在运行时根据不同的情况执行不同的操作,提高类的抽象度和灵活性。接接口口(interface)interface)可看成一个空的抽象的类,只声明了一组类的若干同名变量和方法,而不考虑方法的具体实现。Java的包包(package)package)中包含一系列相关的类,同一个包中的类可直接互相使用,对包外的类则有一定的使用限制。Java的包近似于其它语言的函数库,可提供重用的方便。内内部部类类(Inner Inner ClassClass)是定义在其他类中的类,主要作用是将逻辑上相关联的类放在一起。在解决一个复杂问题时,可能希望创建一个类,用来辅助自己的程序方案,但同时又不愿意它公开,内部类则可以实现这一点。内部类经常用于GUI事件处理12/31/202248第第5章章 继承与多态继承与多态5.7 本章小结内部类(InnerClass)是定义在其他类中的类,主要作用是将逻辑上相关联的类放在一起。在解决一个复杂问题时,可能希望创建一个类,用来辅助自己的程序方案,但同时又不愿意它公开,内部类则可以实现这一点。内部类经常用于GUI事件处理。在本章的详细介绍中,我们先给出了基本概念,然后结合具体实例阐明Java的类的封装和继承、多态、接口、包以及内部类等有关内容。12/31/202249第第5章章 继承与多态继承与多态
限制150内