Java程序设计 课件 【ch06】类的继承_第1页
Java程序设计 课件 【ch06】类的继承_第2页
Java程序设计 课件 【ch06】类的继承_第3页
Java程序设计 课件 【ch06】类的继承_第4页
Java程序设计 课件 【ch06】类的继承_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类的继承Java程序设计第六章01继承的基本方法6.1继承的基本方法继承继承就是利用已有的类定义作为基础,建立新类的技术。新类的定义可以增加新的数据或新的功能,也可以利用原有类的功能。在类的继承中,被继承的类称为父类,继承而来的类称为子类。通过使用继承,我们能够非常方便地复用以前的代码,大大提高开发的效率。6.1继承的基本方法6.1.1子类的定义ava中的继承是在子类定义时通过extends关键字来实现的,子类定义的基本格式为:新定义的子类不仅可以从父类那里继承成员变量和成员方法,还可以定义自己新的变量和方法。Java语言仅提供了单继承结构,而不支持多继承结构,即Java程序中的每个类只允许有一个直接的父类,也就是说,extends关键字后的父类名只能有一个。6.1继承的基本方法【例6-1】子类Apple继承父类Fruit。【程序】【运行结果】酒红,日本【程序说明】在main()方法中,首先对子类进行实例化,接着通过子类对象访问父类中的成员变量和成员方法,同时也访问子类内部的成员变量。6.1继承的基本方法6.1.2覆盖父类方法子类可以重新定义父类的方法,如果在子类中定义一个方法,其名称、返回类型及参数表正好与父类中某个方法的名称、返回类型及参数表相匹配,那么子类的方法就覆盖了父类的方法。其中,参数表相同,是指参数的个数、类型和顺序都相同。子类定义的成员变量也可以与父类的成员变量同名,这种情况一般称为隐藏。6.1继承的基本方法【例6-2】子类方法覆盖父类方法。【程序】【运行结果】【程序说明】在定义Apple类时,若对从Fruit类继承来的eat()方法的功能不满意,可以对eat()方法进行重写,实现对父类eat()方法的覆盖。方法覆盖后,用子类对象去调用eat()方法,执行的是覆盖后的eat()方法,而不是继承自父类的eat()方法。当然,如果用父类对象去调用eat()方法,执行的就是父类的eat()方法。6.1继承的基本方法6.1.3重载父类方法子类不仅可以覆盖父类的方法,还可以重载父类的方法,即子类和父类中的方法名相同,但子类中方法的参数表不同。“农夫果园”中有苹果、橘子和梨3种水果,每种水果对人体都是有益的,只是不同的人在不同时期吃,产生的益处不同而已。6.1继承的基本方法【例6-3】水果有益健康。【程序】【运行结果】【程序说明】子类Apple从父类Fruit中继承了无参数的health()方法,又定义了两个有参数的health()方法。这样,Apple类具有3个具有重载关系的health()方法。在main()方法中用不同的参数表,可分别调用3个不同的方法。吃水果有益一般功效:生津止渴、润肺除烦、健脾益胃、养心益气对于肥胖症和糖尿病患者,食用苹果相对于橘子和梨来说更有益6.1继承的基本方法6.1.4super关键字第一种情况是在子类的构造方法中调用父类的构造方法,子类不会继承父类的构造方法,也就是说,子类的构造方法必须在子类中定义。但在Java语言中,子类的构造方法必须以一定方式调用父类的构造方法。在子类对象创建及初始化的过程中,继承自父类的成员变量的初始化工作通常通过调用父类的构造方法完成,一般有以下三种方式。(1)在子类的构造方法中,直接通过super关键字调用父类的构造方法。例如,在例6-4中的publicCat(Stringname,Stringskill)构造方法中,用语句super(name)调用了父类的构造方法。这样的语句必须是子类构造方法中的第一条有效语句。(2)在子类的构造方法中,通过this关键字调用子类的其他构造方法,而在被调用的子类的构造方法中,直接或间接地调用了父类的构造方法。(3)如果没有通过this或super关键字直接或间接地调用父类的构造方法,则编译器会自动调用父类无参数的默认构造方法。6.1继承的基本方法第二种情况是在子类的成员方法中,用super关键字作为前缀访问继承自父类的成员变量和成员方法。一般情况下,子类的成员方法可以直接使用这些成员。然而,如果子类的成员变量隐藏了父类的成员变量,或者子类的成员方法覆盖了父类的成员方法,就必须通过super关键字引用父类成员。6.1继承的基本方法【例6-4】super关键字的使用。“农夫果园”坐落于山清水秀的杭城郊区,生态环境很好,最近临近秋季,果实成熟,农场主面临一个头疼的问题——“老鼠破坏”,为此,农场养了几只猫。【程序】6.1继承的基本方法【运行结果】无名忙于学本领汤姆忙于抓老鼠【程序说明】Cat类中定义了两个构造方法,第一个构造方法中没有调用父类构造方法的语句,那么就会自动调用Animal类无参数的默认构造方法。如果Animal类没有定义无参数的构造方法,程序就会出现编译错误。第二个构造方法通过super(name)语句调用父类Animal类的构造方法,这种方式更加合理。Cat类的publicvoidwork()方法覆盖了其父类Animal类的publicvoidwork()方法。如果子类成员变量需要调用父类中的publicvoidwork()方法,则必须加上前缀,即用语句super.work()。02访问控制属性6.2访问控制属性1.什么是包计算机操作系统使用文件夹来存放相关或者同类的文档。在Java语言中,提供了包的概念来组织相关的类。包在物理上是一个文件夹,逻辑上代表一个分类概念。包采用层次化的树形结构,包中可以包含许多类,也可以包含下层包。就像同一个文件夹中不能有同名文件一样,同一包中的类的名字也不能相同。如果同名的类位于不同包中,则它们被认为是不同的,因而以包的形式组织类可以解决命名重复问题。6.2.1类与包6.2访问控制属性2.用import引入包中的类使用某一个包的类,一般需要用import语句来引入。例如,java.util包中有Scanner、Date等工具类。要使用Scanner类,可以采用以下方式:(1)用importjava.util.Scanner语句引入包中的Scanner类;(2)用importjava.util.*语句引入包中的所有类(但不包括下层包中的类);(3)不使用import语句,而在类名加上包名作为前缀。6.2访问控制属性3.自定义包在定义类时,可以用package语句指定类所属的包,例如,packagech06.p1语句指定类属于ch06.p1包。这样的语句必须是源程序文件中的第一行(除注释语句之外)。如果类定义时未使用package语句,类就被放在默认的未命名包中。这个类只能被同属于默认包的类使用,而不能被其他包中的类使用。6.2访问控制属性【例6-5】定义和使用包。【程序】【运行结果】无名忙于学本领汤姆忙于抓老鼠【程序说明】为了说明包的定义和使用,本例对例6-4的程序略作修改。用package语句把Animal类和Cat类分别放在ch06.p1包和ch06.p2包。由于两个类属于不同的包,那么Cat类要使用Animal类作为父类,必须先用importch06.p1.Animal语句引入Animal类。6.2访问控制属性类的访问控制属性类的访问控制属性有两种:(1)public,表明这个类可以被所有的类使用,可以创建这个类的对象或用这个类派生新类。(2)省略,表明这个类只能被同一个包中的类使用,而不能被其他包中的类使用,这种访问特性又称包访问性。6.2.2类的访问控制6.2访问控制属性【例6-6】类的访问控制。创建包x和z,在包x中定义类Garden,在包z中定义类Visitor。【程序】【程序说明】两个类在不同的包下面,当Garden类用public修饰时,在Visitor中可以访问到Garden,但是将Garden类的修饰符public删掉,变为省略时,在Visitor中就无法访问到Garden。如果把两个类都放在同一个包中,那么将Garden类的修饰符public删掉,变为省略时,在Visitor中可以访问到Garden类。6.2访问控制属性类的访问控制属性在Java中,无论是成员方法还是成员变量,都经常用到public、protected和private这3个修饰符。表6-1给出了这几个访问控制符的访问权限。6.2.3类成员的访问控制public(公有)public为公有访问控制符,即被其修饰的方法或变量可以被包内或者包外的类访问,而不受任何限制。private(私有)private为私有访问控制符,即其只能被这个类的自身访问,而不能被其他任何类访问。在同一个包中,private定义的成员也不能被其他类访问,实现真正地把自己与其他类分隔开,所以称为私有访问控制符。无修饰符(包访问权限)如果没有添加任何访问控制符,则默认为包访问权限。包访问权限的成员可以被这个类的自身访问,也可以被同一个包中的其他类访问。protected(受保护)限定为protected的成员可以被这个类的自身访问,也可以被同一个包中的其他类访问,还可以被这个类的子类(包括同一包和不同包中的子类)所继承。6.2访问控制属性010203046.2访问控制属性【例6-7】使用访问控制。【程序】【程序说明】本例中给一些成员变量和成员方法加上了访问控制符。这样,通过将一些属性的访问权限设定为private,可限制所有类外部对这些属性的访问,而为了让外部可以访问这些属性,可专门声明对应的getType()方法来读取/存储数据。public声明的成员变量和成员方法允许任意类访问,private声明的成员变量和成员方法只能在本类内部访问,protected声明的成员变量和成员方法可以被子类的成员方法访问,但不能被子类的对象访问。03抽象类与接口6.3抽象类与接口6.3.1抽象方法与抽象类1.抽象方法抽象方法就是用abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,而没有方法体,也就是说,抽象方法只需要声明而不需要实现,也一定不能有方法体。2.抽象类抽象类可以包含非抽象的方法,可以定义构造方法,也并非一定要包含抽象方法。但一个类中如果包含抽象方法,那么该类必须被定义为抽象类,也就是说,只有抽象类才可以包含抽象方法。6.3抽象类与接口【例6-8】苹果嫁接。【程序】【程序说明】Apple类中定义了一个抽象方法,因而被定义为抽象类。Apple类不可直接用于创建对象,但可以定义其子类NewApple,并在子类中重写抽象方法getType()。【运行结果】红色农夫苹果1号很好吃6.3抽象类与接口6.3.2接口接口接口可以理解为一种特殊的抽象类,但接口与类存在显著的区别,类有它的成员变量和成员方法,而接口中却只有常量和抽象方法。接口修饰符为接口访问权限,有public和省略两种状态。public表示任意类均可以使用这个接口。在省略情况下,只有与该接口定义在同一包中的类才可以访问这个接口,而其他包中的类无权访问该接口。一个接口可以继承其他接口,通过关键字extends来实现,其语法与类的继承相同。被继承的类接口称为父类接口,当有多个父类接口时,用逗号“,”分隔。6.3抽象类与接口【例6-9】“苹果和梨”共生。【程序】【程序说明】在两个接口中分别定义了一个抽象方法,在子类中实现了两个接口中的抽象方法。【运行结果】新盆景上生长出:农夫1号苹果农夫1号梨04内部类与匿名类6.4内部类与匿名类6.4.1内部类成员内部类成员内部类,就是作为外部类的成员,可以直接使用外部类中的所有成员和方法(即使是private的)。同时,如果外部类要访问内部类中的所有成员变量和方法,则需要通过内部类的对象来获取。需要注意的是,成员内部类中不能含有static的变量和方法。因为需要先创建外部类,才能创建成员内部类。在成员内部类中要引用外部类对象时,可使用outer.this表示外部类对象;而需要创建内部类对象时,可使用“outer.innerobj=outerobj.newinner()”语句。6.4内部类与匿名类【例6-10】创建内部类Inner,并用外部类Outer调用。【程序】6.4内部类与匿名类【例6-11】创建内部类Inner,并用外部类Outer调用(使用get×××()来获取成员内部类)。【程序】6.4内部类与匿名类6.4.2匿名类匿名内部类有时候为了免去给内部类命名,可以使用匿名内部类,因为它没有名字。匿名内部类应该是平时我们编写代码时用得最多的内部类,在编写事件监听代码时,或者在多线程中时,使用匿名内部类不但方便,而且能使代码更加易于维护。匿名内部类是不能加访问修饰符的。需要注意的是,“new匿名类”中的这个类是要先定义好的。6.4内部类与匿名类【例6-12】创建匿名内部类Inner,并用外部类Outer调用。【程序说明】注意外部类方法的形参,当所在方法的形参需要被内部类使用时,该形参必须是final的。这里可以看到,形参name已经被定义为final的了,而形参city没有被使用,所以不用定义为final的。05范例6.5范例【例6-13】用继承Thread类的匿名内部类实现多线程。6.5范例【例6-14】通过定义public方法访问私有成员变量,更好地控制和保护变量。【分析】程序中,我们将密码设置为null,通过对其进行是否为空的判断,防止恶意的数据录入。【程序】6.5范例【例6-15】定义经理类与员工类。【分析】首先定义一个员工类Employee(包含姓名和工资两个属性),接着定义一个经理类Manager(包含奖金一个属性),由于经理类继承员工类,所以经理类也拥有姓名和工资的属性,因此在测试类Test的main()方法中,会发现经理类比员工类多了一个奖金属性的设置。在定义类的时候,尽量利用父类和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论