《Java程序设计基础-第6章类的继承、抽象类、接口.ppt》由会员分享,可在线阅读,更多相关《Java程序设计基础-第6章类的继承、抽象类、接口.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、主讲主讲:周清周清JAVA程序设计基础程序设计基础TEL:18626624236第六章第六章 类的继承、抽象类与接口类的继承、抽象类与接口3通过本章的学习,主要掌握以下知识点:通过本章的学习,主要掌握以下知识点:类的继承类的继承子类的创建子类的创建调用父类中特定的构造方法调用父类中特定的构造方法在子类中访问父类的成员在子类中访问父类的成员覆盖覆盖抽象类抽象类接口接口内部类与匿名类内部类与匿名类包包4本章的重点:本章的重点:类的继承类的继承覆盖覆盖抽象类抽象类接口接口本章的难点:本章的难点:内部类与匿名类内部类与匿名类5类的继承类的继承v理解继承是理解面向对象程序设计的关键。理解继承是理解面向对
2、象程序设计的关键。v在在Java中,通过关键字中,通过关键字extends继承一个已继承一个已有的类,被继承的类称为父类(超类,基类),有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。新的类称为子类(派生类)。v在在Java中,不允许多继承。中,不允许多继承。66.1 6.1 类的继承类的继承通过继承可以实现代码的复用。通过继承可以实现代码的复用。v父类或超类父类或超类(superclass)(superclass)被继承的类被继承的类v子类(子类(subclasssubclass)由继承而得到的类由继承而得到的类一一个个父父类类可可以以同同时时拥拥有有多多个个子子类类,但
3、但由由于于JavaJava中中不不支支持持多多重重继继承承,所所以以一一个个类类只只能能有有一一个个直直接接父父类。类。7在在JavaJava语语言言中中有有一一个个称称为为java.lang.Objectjava.lang.Object的的特特殊殊类类,所所有有的的类类都都是是直直接接或或间间接接地地继继承承该该类类而而得得到到的。的。8格式:格式:class SubClass class SubClass extendsextends SuperClass SuperClass 把把SubClassSubClass声明为类声明为类SuperClassSuperClass的直接子类,如的直接
4、子类,如果果SuperClassSuperClass又是某个类的子类,则又是某个类的子类,则SubClassSubClass同时也同时也是该类的间接子类。是该类的间接子类。6.1.1 6.1.1 子类的创建子类的创建9如果没有如果没有extendsextends关键字,则该类默认为关键字,则该类默认为java.lang.Objectjava.lang.Object类的子类。因此,在类的子类。因此,在JavaJava中中所有的类都是通过直接或间接地继承所有的类都是通过直接或间接地继承java.lang.Objectjava.lang.Object类得到的。所以在此之前的类得到的。所以在此之前的所
5、有例子均是所有例子均是java.lang.Objectjava.lang.Object类的子类。类的子类。101.子类的构建方法【例例6.16.1】类的继承类的继承/app6_1.java 继承的简单例子class Person /Person类是java.lang.Object类的子类 private String name;/name表示姓名 private int age;/age表示年龄 public Person()/定义无参构造方法 System.out.println(“调用了个人构造方法Person()”);public void SetNameAge(String name,
6、int age)this.name=name;this.age=age;11public void show()System.out.println(“姓名:“+name+”年龄:”+age);class Student extends Person /定义Student类,继承自Person类 private String department;public Student()/Student的构造方法 System.out.println(“调用了学生构造方法Student()”);12public void SetDepartment(String dep)department=dep;
7、System.out.println(“我是”+department+”的学生”);public class app8_1 /主类 public static void main(String args)Student stu=new Student();/创建Student对象 stu.SetNameAge(“张小三”,21);/调用父类的SetNameAge()方法 stu.show();/调用父类的show()方法 stu.SetDepartment(“计算机系”);/调用子类的SetDepartment方法 13程序执行的结果为:调用了个人构造方法Person()调用了学生构造方法St
8、udent()姓名:张小三 年龄:21我是计算机的学生14说明说明:(1)(1)通过通过extendsextends关键字,可将父类的成员继承给关键字,可将父类的成员继承给子类。子类。(2)Java(2)Java在执行子类的构造方法之前,会先自动调在执行子类的构造方法之前,会先自动调用父类中没有参数的构造方法,其目的是为了帮助继用父类中没有参数的构造方法,其目的是为了帮助继承自父类的成员做初始化的操作。承自父类的成员做初始化的操作。(3)(3)在严格意义上说,构造方法是不能被继承的,在严格意义上说,构造方法是不能被继承的,例如父例如父PersonPerson有一个构造方法有一个构造方法Pers
9、on(String,int)Person(String,int),不能说子类不能说子类StudentStudent也自动有一个构造方法也自动有一个构造方法Person(String,int)Person(String,int),但这并不意味着子类不能调用,但这并不意味着子类不能调用父类的构造方法。父类的构造方法。152.调用父类中特定的构造方法【例例6.2】调用父类中某指定的构造方法。调用父类中某指定的构造方法。/app6_2.java调用父类中的特定构造方法调用父类中的特定构造方法classPerson/定义定义PersonprivateStringname;privateintage;pu
10、blicPerson()/定义无参构造方法定义无参构造方法System.out.println(“调用了调用了Person的无参构造方法的无参构造方法”);publicPerson(Stringname,intage)/定义有参构造方法定义有参构造方法System.out.println(“调用了调用了Person的有参构造方法的有参构造方法”);this.name=name;this.age=age;16publicvoidshow()System.out.println(“姓名:姓名:“+name+”年龄:年龄:”+age);classStudentextendsPerson/定义继承自定
11、义继承自Person类的子类类的子类StudentprivateStringdepartment;publicStudent()/Student的无参构造方法的无参构造方法System.out.println(“调用了学生的无参构造方法调用了学生的无参构造方法Student()”);17publicStudent(Stringname,intage,Stringdep)/定义定义Student的有参构造的有参构造方法方法super(name,age);/调用父类的有参构造方法,在第调用父类的有参构造方法,在第10行定义的行定义的department=dep;System.out.println
12、(“我是我是”+department+”的学生的学生”);System.out.println(“调用了学生的有参构造方法调用了学生的有参构造方法Student(Stringdep)”);publicclassapp6_2/主类主类publicstaticvoidmain(Stringargs)Studentstu1=newStudent();/创建对象,并调用无参构造方法创建对象,并调用无参构造方法Studentstu2=newStudent(“李小四李小四”,23,”信息系信息系”);/并调用有参构造方并调用有参构造方法法stu1.show();stu2.show();18程序运行结果如下
13、:程序运行结果如下:调用了调用了Person的无参构造方法的无参构造方法调用了学生的无参构造方法调用了学生的无参构造方法Student()调用了调用了Person的有参构造方法的有参构造方法我是信息系的学生我是信息系的学生调用了学生的有参构造方法调用了学生的有参构造方法Student(Stringdep)姓名:姓名:null年龄:年龄:0姓名:李小四姓名:李小四年龄:年龄:23196.1.2 6.1.2 在子类中访问父类的成员在子类中访问父类的成员格式:super.super.201/app6_3.java用用protected修饰符和修饰符和super关键字访问父类的成员关键字访问父类的成员
14、2classPerson/定义定义Person34protectedStringname;5protectedintage;6publicPerson()/定义定义“不做事不做事”的无参构造方法的无参构造方法7publicPerson(Stringname,intage)/定义有参构造方法定义有参构造方法89this.name=name;10this.age=age;1112protectedvoidshow()1314System.out.println(“姓名:姓名:“+name+”年龄:年龄:”+age);1516【例例8.38.3】在子类中访问父类的成员。在子类中访问父类的成员。211
15、7classStudentextendsPerson/定义子类定义子类Student,其父类为,其父类为Person1819privateStringdepartment;20intage=20;/新添加了一个与父类的成员变量新添加了一个与父类的成员变量age同名的成员变量同名的成员变量21publicStudent(Stringxm,Stringdep)/定义定义Student的有参构造方法的有参构造方法2223name=xm;/在子类里直接访问父类的在子类里直接访问父类的protected成员成员24department=dep;25super.age=25;/利用利用super关键字将父
16、类的成员变量关键字将父类的成员变量age赋值为赋值为2526System.out.println(“子类子类Student中的成员变量中的成员变量age=”+age);27super.show();/去掉去掉super而只写而只写show()亦可亦可28System.out.println(“系别:系别:”+department);293031publicclassapp8_3/主类主类3233publicstaticvoidmain(Stringargs)3435Studentstu=newStudent(“李小四李小四”,”信息系信息系”);363722程序执行结果为:程序执行结果为:子类
17、子类Student中的成员变量中的成员变量age=20姓名:李小四姓名:李小四年龄:年龄:25系别:信息系系别:信息系236.1.3 6.1.3 覆盖覆盖覆盖(Overriding)是指在子类中定义名称、参数个数与类型均与父类相同的方法,用以重写父类里同名方法的功能。241.覆盖父类的方法覆盖父类的方法子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数类型列表。25例例 6.4 6.4 以个人类以个人类PersonPerson为父类,创建学生子类为父类,创建学生子类Student,Student,并并用子类方法覆盖父类方法。用子类方法覆
18、盖父类方法。/app6_4.java 方法的覆盖class Person /定义Person protected String name;protected int age;public Person(String name,int age)/定义构造方法 this.name=name;this.age=age;public void show()System.out.println(“姓名:“+name+”年龄:”+age);26class Student extends Person /定义子类Student,其父类为Person private String department;pub
19、lic Student(String name,int age,String dep)/定义构造方法 super(name,age);department=dep;public void show()/覆盖父类Person中的的同名方法 System.out.println(“系别:”+department);27public class app6_4 public static void main(String args)Student stu=new Student(“王老五”,24,”电子”);stu.show();282.用父类的变量访问子类的成员通过父类对象也可以访问子类成员。29【
20、例例6.56.5】利用父类对象调用子类中成员。利用父类对象调用子类中成员。1/app6_5.java通过父类的对象来调用子类的成员通过父类的对象来调用子类的成员2classPerson/定义定义Person34protectedStringname;5protectedintage;6publicPerson(Stringname,intage)/定义构造方法定义构造方法78this.name=name;9this.age=age;1011publicvoidshow()1213System.out.println(“姓名:姓名:“+name+”年龄:年龄:”+age);14153016cla
21、ssStudentextendsPerson/定义子类定义子类Student,其父类为,其父类为Person1718privateStringdepartment;19publicStudent(Stringname,intage,Stringdep)/定义构造方法定义构造方法2021super(name,age);22department=dep;2324publicvoidshow()2526System.out.println(“系别:系别:”+department);2728publicvoidsubshow()2930System.out.println(“我在子类中我在子类中”);
22、31323133publicclassapp6_5/主类主类3435publicstaticvoidmain(Stringargs)3637Personper=newStudent(“王老五王老五”,24,”电子电子”);/声明父类变量声明父类变量per指指向对象向对象38per.show();/利用父类对象利用父类对象per调用调用show()方法方法39/per.subshow();4041程序执行结果为:程序执行结果为:系别:电子系别:电子326.1.4 6.1.4 不可被继承的成员与最终类不可被继承的成员与最终类如果父类的成员不希望被子类的成员所覆盖可以将它们声明为final。如果用f
23、inal来修饰成员变量,则说明该成员变量是最终变量,即常量,程序中的其他部分可以访问,但不能修改。336.1.5 Object6.1.5 Object类类在在JavaJava语言中有一个特殊类语言中有一个特殊类ObjectObject,该,该类是类是java.langjava.lang类库里的一个类,所有的类类库里的一个类,所有的类都是直接或间接地继承该类而得到的。都是直接或间接地继承该类而得到的。34表表6.1 Object6.1 Object类常用的方法类常用的方法方方法法功功能能说说明明publicBooleanequals(Objectobj)判断两个类变量所指向的是否为同一个对象。p
24、ublicStringtoString()将调用toString()方法的对象转换成字符串。publicfinalClassgetClass()返回调用getClass()方法的对象所属的类。protectedObjectclone()返回调用该方法的对象的一个副本。356.2 6.2 抽象类抽象类在在Java中可以创建专门的类来做为父类,这中可以创建专门的类来做为父类,这种类被称为种类被称为“抽象类抽象类”(Abstractclass)。抽象类。抽象类有点类似有点类似“模板模板”的作用,其目的是根据它的格的作用,其目的是根据它的格式来创建和修改新的类。式来创建和修改新的类。366.2.1 6
25、.2.1 抽象类与抽象方法抽象类与抽象方法定义抽象类的语法格式如下:定义抽象类的语法格式如下:abstract class abstract class 类名类名 声明成员变量;声明成员变量;返回值的数据类型返回值的数据类型 方法名(参数表)方法名(参数表)abstract abstract返回值的数据类型返回值的数据类型 方法名(参数表);方法名(参数表);376.2.2 6.2.2 抽象类的应用抽象类的应用由于抽象类的目的是要根据它的格式来创建由于抽象类的目的是要根据它的格式来创建新的类,所以抽象类里的抽象方法并没有定义处新的类,所以抽象类里的抽象方法并没有定义处理数据的方法体,而是要保留
26、给由抽象类派生出理数据的方法体,而是要保留给由抽象类派生出的新类来定义。的新类来定义。386.3 6.3 接口接口接口(Interface)是Java所提供的另一种重要功能,它的结构与抽象类非常相似。接口本身也具有数据成员与抽象方法。396.3.1 6.3.1 接口的定义接口的定义接口定义的语法格式如下:public interface 接口名称 extends 父接口名列表publicstaticfinal 数据类型 成员变量名=常量;publicabstract 返回值的数据类型 方法名(参数表);406.3.2 6.3.2 接口的实现与引用接口的实现与引用在声明一个类的同时用关键字imp
27、lements来实现一个接口。接口实现的语法格式为:class 类名称 implements 接口名表 41一个类要实现一个接口时,应注意以下问题:(1)非抽象类中不能存在抽象方法。(2)一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。(3)接口中抽象方法的访问控制修饰符都已指定为public,所以类在实现方法时,必须显示地使用public修饰符。426.3.3 接口的继承与类相似,接口也有继承性。定义一个接口与类相似,接口也有继承性。定义一个接口时可通过时可通过extends关键字声明该新接口是某个已存关键字声明该新接口是某个已存在的父接口的派生接口,它将继承父接口的所有在的父接口
28、的派生接口,它将继承父接口的所有变量与方法。与类的继承不同的是,一个接口可变量与方法。与类的继承不同的是,一个接口可以有一个以上的父接口,它们之间用逗号分隔,以有一个以上的父接口,它们之间用逗号分隔,形成父接口列表。形成父接口列表。436.3.4 利用接口实现类的多重继承所谓多重继承,是指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。Java虽不支持多重继承,但可利用接口来实现比多重继承更强的功能。一个类实现多个接口时,在implements子句中用逗号分隔。446.4 内部类与匿名类内部类(Inner Class)是定义在类中的类,内部类的主要作用是将逻辑上相关的类放
29、到一起;而匿名类(Anonymous Class)是一种特殊的内部类,它没有类名,在定义类的同时,就生成该类的一个实例,由于不会在其他地方用到该类,所以不用取名字。456.4.1 内部类内部类是包含在类中的类,所以内部类也称为“嵌套类”,包含内部类的类又称为“外部类”。其实内部类可以看作是外部类的一个成员,所以内部类也称为“成员类”。46/Group.java内部类与外部类的访问规则内部类外部类publicclassGroupprivateintage;/声明外部类的私有成员变量publicclassStudent/声明内部类Stringname;/声明内部类的成员变量publicStuden
30、t(Stringn,inta)/定义内部类的构造方法name=n;/访问内部类的成员变量nameage=a;/访问外部类的成员变量agepublicvoidoutput()/内部类的成员方法System.out.println(“姓名:”+this.name+”;年龄:”+age);【例6.14】内部类与外部类的访问规则。47publicvoidoutput()/定义外部类的成员方法Studentstu=newStudent(“刘洋”,24);/创建内部类对象stustu.output();/通过stu调用内部类的成员方法publicstaticvoidmain(Stringargs)Grou
31、pG=newGroup();G.output();程序运行结果如下:姓名:刘 洋;年龄:24486.4.2 6.4.2 匿名内部类匿名内部类匿名内部类(anonymous inner class),是指可以利用内部类创建没有名称的对象,并利用它访问到类里的成员。49创建匿名内部类并访问成员的语法格式如下:创建匿名内部类并访问成员的语法格式如下:(/创建匿名内部类,并执行所定义的方法创建匿名内部类,并执行所定义的方法 new new 类名类名()/()/括号括号“()()”内不允许有参数内不允许有参数 方法名(参数方法名(参数1 1,参数,参数2 2,参数,参数n n)方法体语句;方法体语句;)
32、.方法名(参数方法名(参数1 1,参数,参数2 2,参数,参数n n););506.5 包java中引如了包(package)的概念来管理类名空间。就像文件夹把各种文件组织在一起,使硬盘更清晰、有条理一样,Java中的包把各种类组织在一起,使得程序功能清楚、结构分明。516.5.1 6.5.1 包的概念包的概念包就是Java提供的一种区别类名空间的机制,是类的组织方式,包对应一个文件夹,包中还可以再有包,称为包等级。526.5.2 6.5.2 使用使用packagepackage语句创建包语句创建包格式:package 包名1.包名2.包名3;536.5.3 Java中的常用包Java的常用包
33、有:java.lang语言包java.io输入输出流的文件包java.awt抽象窗口工具包java.util实用包java.appletApplet小程序包网络功能包java.sql数据库连接包java.text文本包546.5.4 利用import语句引用Java定义的包如果要使用Java包中的类,必须在源程序中用import语句导入所需要的类。import语句格式:import.|*其中import是关键字,.表示包的层次,与package语句相同,它对应于文件夹。556.6 Java的垃圾回收垃圾回收(Garbage-collection)是Java提供的一种自动内存回收功能,可以让程序员减轻许多内存管理的负担,也减少程序员犯错的机会。