1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章主要介绍以下几个问题,1.Java,语言的继承,2.,Java,语言的多态,3.,Java,方法的重载,4.构造函数的继承与重载,5.,Java,语言的包,6.,Java,语言的接口,第五章 继承与多态,5.1 继承,1.继承和多态是面向对象程序设计的两个重要特点。继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,充分利用已有的类来完成更复杂、更深入的开发。,第五章 继承与多态,5.1 继承,2.,当一个类拥有另一个类的所有数据和操作时,就称这两个类之间存在着继
2、承关系。被继承的类称为父类或超类,继承了父类的所有数据和操作的类就为子类。,3.一个父类可以同时拥有多个子类,此时父类实际是所有子类的公共域和公共方法的集合;而每一个子类则是父类的特殊化,是对父类公共域和方法在功能、内涵方面的扩展和延伸。,第五章 继承与多态,5.1 继承,4.单重继承是指任何一个类都只有一个单一的父类,其结构可以用单纯的树状结构来表示;若一个类有一个以上的父类则称为多重继承。其结构应以复杂的网状结构来表示。,Java,语言仅支持单重继承。,5.在面向对象的程序设计中,采用继承的方式来组织设计系统中的类,可以提高程序的抽象程度,更接近人的思维方式,使程序结构更清晰并降低编码和维
3、护的工作量。,第五章 继承与多态,5.2,Java,的继承,5.2.1 派生子类,1.,Java,语言中类的继承是通过类定义的,extends,关键字来实现的。即关键字指明了新定义类的父类,从而建立了两个类之间的继承关系,新定义的类是子类,它继承了父类所有非,private,的属性和方法作为自己的成员。,2.分析图5-1和例5-1电话卡类的继承结构。,第五章 继承与多态,5.2.2 域的继承与隐藏,1.域的继承是指子类可以继承父类的所有非私有域。分析例5-1。可见:父类的所有非私有域实际是各个子类所拥有的域的集合。,2.子类重新定义一个与从父类那里继承来的域变量完全相同的变量,称为域的隐藏。,
4、第五章 继承与多态,5.2.2 域的继承与隐藏,3.域的隐藏是指子类拥有了两个相同名字的变量,其中 一个来自于父类,另一个由自己定义。,4.当子类执行来继承自父类的操作时,处理的是继承父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己定义的变量,而把继承来自父类的变量“隐藏”起来。,5.例5-2。,第五章 继承与多态,5.2.3 方法的继承与覆盖,1.方法的继承:方法的继承是指父类的非私有方法也可以被子类继承。例5-2。,2.方法的覆盖:是指子类也可以重新定义与父类同名的方法,实现对父类的覆盖。子类在重新定义父类已有的方法时应保持与父类完全相同的方法名、返回值和参数列表,否则就不是
5、方法的覆盖。,第五章 继承与多态,5.2.3 方法的继承与覆盖,3.,方法的覆盖与域的隐藏的区别在于:子类隐藏父类的域是使父类的域不可见,而父类的同名域在子类的对象中仍然占有独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法在内存所占用的空间,从而使父类方法在子类的对象中不复存在。,4.,例5-3。,第五章 继承与多态,5.2.4,this,和,super,1.Java,系统默任:每个类都缺省地具有,null、this,和,super,三个域,可以在任意类中不加说明地直接使用这三个域。,2.null,代表“空”值,在定义一个对象但尚未为其开辟内存空间时,可以指定这个对象为,null,
6、第五章 继承与多态,5.2.4,this,和,super,3.this,表示的是当前对象本身,它实际代表了当前对象的一个引用。一个对象可以有若干个引用,,this,只是其中的一个。,4.例5-4。,5.super,表示的是当前对象的直接父类对象,是对直接父类对象的引用。,6.例5-5。,第五章 继承与多态,5.2.4,this,和,super,7.,直接父类,例如:,A,类派生出,B,类,,B,类派生出,C,类,那么,B,是,C,的“直接父类”;,A,是,C,的“祖先类”。,同理:,Number_PhoneCard,类是,D200_Card,类的“直接父类”,,PhoneCard,类是,D
7、200_Card,类的“祖先类”。,第五章 继承与多态,5.2.4,this,和,super,8.,父类对象与子类对象的转换,(1)子类对象可以被视为是其父类的一个对象。,(2)父类对象不能被当作是某一个子类的对象。,第五章 继承与多态,5.2.4,this,和,super,8.,父类对象与子类对象的转换,(3)如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。,(4)如果父类对象与引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,9.p102,程序片段,第五章 继承与多态,5.3 多态,1.,多态,是指一个程
8、序中,同名的,不同方法,共存的情况,2.,多态,可通过子类对父类方法的覆盖实现多态,也可以利用重载在同一个类中定义多个同名的不同方法实现多态。,3.,方法的重载(同一个类),方法的覆盖(父类和子类),域的隐藏(父类和子类)。,第五章 继承与多态,5.4,Java,的重载,1.,方法的重载是实现,Java,语言多态技术的重要手段。,2.方法的重载与方法的覆盖不同,方法的重载不是子类对父类同名方法的重新定义,而是同一类中若干同名方法的重新定义。,3.例5-6。,第五章 继承与多态,5.5 构造函数的继承与重载,5.5.1,构造函数的重载,1.,构造函数的主要功能是完成对类对象的初始化操作。当类对象
9、创建时,系统根据实参自动调用该类相应的构造函数初始化该对象。,2.构造函数的重载是指在同一个类中存在若干个具有不同参数列表的构造函数。,3.,P107,页代码片断。,第五章 继承与多态,5.5.1,构造函数的重载,4.,当一个构造函数需要调用另一个构造函数时,可以使用关键字,this,,同时这个调用语句应该是整个构造函数的第一个可执行语句。,5.,P108,页代码片断。,第五章 继承与多态,5.5.2,构造函数的继承,1.,子类无条件地继承父类不含参数的构造函数。,2.如果子类自己定义了构造函数,则在创建新对象时,它将先执行继承自父类不含参数的构造函数,然后再执行自己的构造函数。,第五章 继承
10、与多态,5.5.2,构造函数的继承,3.对于父类含参数的构造函数,子类可以通过在自己的构造函数中使用关键字,super,来调用它,但是这个调用语句必须是子类构造函数的第一个可执行语句。,4.分析,p109,代码片断。,5.例5-7。,第五章 继承与多态,5.6,包,5.6.1,创建包,系统自动建立“无名包”:在缺省情况下,系统会为每一个.,java,源文件中定义的所有类创建一个“无名包”,在包内可以相互引用非,private,的域或方法。但是由于“无名包”没有包名,所以“无名包”中的类不能被其它包中的类所引用,为此应该创建有名包。,第五章 继承与多态,5.6.1,创建包,2.,创建有名包的语句
11、格式为,package,;,语句功能:该语句将创建一个具有指定名字的包,该包将把当前.,Java,文件中的所有类集合到这个包内。,例如:,package CardClasses,该,语句是在当前文件夹下创建一个名为,CardClasses,的子文件夹包,第五章 继承与多态,5.6.1,创建包,又如:,package CardSystem.CardClasses,该语句是在当前文件夹下创建了两个文件夹,,第一个是在当前文件夹下的子文件夹,CardSystem,;,第二个是在,CardSystem,下的子文件夹,CardClasses,,,当前包中的所有类均存放在这个文件夹里。,3.,P,114,
12、页的代码片断。,第五章 继承与多态,5.6.2,包的引用,1.通常一个类只能引用与它在同一个包中的类。若需要引用其它包中的,public,类,可以采用以下几种方法。,(1)使用包名、类名作为前缀。,(2)加载需要使用的类。,如,import CardClasses.D200_Card;,(3)加载整个包。如,import CardClasses.*;,(4)使用环境变量,CLASSPATH,第五章 继承与多态,5.7,接口,5.7.1,接口概述,1.,Java,语言的接口是用来实现类间多重继承功能的结构。它定义了若干个抽象方法和常量用以实现多重继成的功能。,2.Java,语言不支持多重继承,只
13、支持单重继承(只有一个直接父类)。为了使,Java,程序的类层次结构更加合理,更符合实际问题的需要,我们把用于完成特定功能的若干属性组织成相对独立的属性集合。这种属性的集合就是接口。,第五章 继承与多态,5.7.1,接口概述,3.如前面图形界面程序中使用的,ActionListener,就是系统定义的接口,它代表了监听并处理动作事件的功能,其中包含了一个抽象方法:,public void actionPerformed(ActionEvent e);,4.所有需要处理动作事件的类(如单击按钮、在文本框中回车等)都必须具有,ActionListener,接口定义的功能。具体的说,就是必须实现这个
14、接口,覆盖,actionPerformed(),方法。,第五章 继承与多态,5.7.2,声明接口,1.接口的声明格式:包括接口头和接口体两部分,public interface,接口名,extends,父接口名表,publicstaticfinal,域类型 域名=常量值;,publicabstractnative,返回值 方法名(参数列表),throw,异常列表,第五章 继承与多态,5.7.2,声明接口,2.接口是一种特殊的类,它是由常量和抽象方法组成的特殊类。一个类只能有一个父类,但可以同时实现若干个接口。,3.interface,是接口定义的关键字。,public,接口可以被任意的类和接口
15、使用,,,没有,public,修饰的接口则只能被同一个包中的其它类和接口利用。,第五章 继承与多态,5.7.2,声明接口,4.接口也有继承性。定义接口时可以通过关键字,extends,说明当前定义的接口与哪个接口具有继承关系,当前接口将继承父接口所有的属性和方法。在此一个接口可以有多个父接口,它们之间用逗号分隔,形成父借口列表。,5.,接口体的定义很重要,接口体由两部分组成,即域的定义和方法的定义两部分。,第五章 继承与多态,5.7.2,声明接口,6.接口中的域都必须是,public static final,,无论是否显示地说明;接口中的方法都必须是,public abstract,,无论是
16、否显示地说明。,7.Java,系统类库中定义了很多接口,如接口,DataInput,中定义了大量按数据类型读取数据的方法,。,第五章 继承与多态,5.7.3,实现接口,1.,Java,声明的接口仅仅给出了抽象方法,而具体地实现接口所规定的功能,还须一个类为接口中的抽象方法定义实在的方法体,即实现接口。,2.类实现接口注意的问题。,(1)在类的声明(定义)部分用,implements,关键字说明该类将要实现那些接口。,第五章 继承与多态,5.7.3,实现接口,(2)如果实现某个接口的类不是,abstract,的抽象类,则在类的定义部分必须为所有抽象方法定义方法体,方法头部分应该与接口中的定义完全一致。,(3)如果实现某接口的类是,abstract,的抽象类,则它可以不实现该接口所有的方法。,第五章 继承与多态,5.7.3,实现接口,(4)一个类在实现某个接口的抽象方法时,必须使用完全相同的方法头。,(5)接口的抽象方法访问修饰符为,public,类在实现方法时必须使用修饰符,public,。,3.例5-8。,






