《Java程序设计第2版第八章课件》由会员分享,可在线阅读,更多相关《Java程序设计第2版第八章课件(43页珍藏版)》请在金锄头文库上搜索。
1、1,第8章,继承、抽象类和接口,2,通过本章的学习,主要掌握以下知识点: 类的继承 子类的创建 调用父类中特定的构造方法 在子类中访问父类的成员 覆盖 抽象类 接口 内部类与匿名类 包,3,本章的重点: 类的继承 覆盖 抽象类 接口 本章的难点: 内部类与匿名类,4,8.1 类的继承,类的继承是面向对象程序设计的一个重要特点,通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。一个父类可以同时拥有多个子类,但由于Java中不支持多重继承,所以一个类只能有一个直接父类。,5,在Java语言中有一个称为java.lang.Ob
2、ject的特殊类,所有的类都是直接或间接地继承该类而得到的。,6,通过在类的声明时使用extends关键字来创建一个类的子类,其格式如下: class SubClass extends SuperClass 把SubClass声明为类SuperClass的直接子类,如果SuperClass又是某个类的子类,则SubClass同时也是该类的间接子类。,8.1.1 子类的创建,7,如果没有extends关键字,则该类默认为java.lang.Object类的子类。因此,在Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。所以在此之前的所有例子均是java.lang
3、.Object类的子类。,8,一、子类的构建方法 【例8.1】类的继承,创建个人类Person,再以该类为父类创建一个学生子类Student,/app8_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, int a
4、ge) this.name=name; this.age=age; ,9,public void show() System.out.println(“姓名:“+name+” 年龄:”+age); class Student extends Person /定义Student类,继承自Person类 private String department; public Student() / Student的构造方法 System.out.println(“调用了学生构造方法Student()”); ,【例8.1】续,10,public void SetDepartment(String dep
5、) department=dep; 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方法 ,【例8.1】续,11,程序
6、执行的结果为: 调用了个人构造方法Person() 调用了学生构造方法Student() 姓名:张小三 年龄:21 我是计算机的学生,【例8.1】续,12,说明: 1通过extends关键字,可将父类的成员继承给子类。在使用这些继承过来的成员时,可利用过去惯用的语法即可,如第38和39行均是利用子类所产生的stu对象,调用从父类继承而来的方法。 2Java在执行子类的构造方法之前,会先自动调用父类中没有参数的构造方法,其目的是为了帮助继承自父类的成员做初始化的操作。 3在严格意义上说,构造方法是不能被继承的,例如父Person有一个构造方法Person(String,int),不能说子类Stu
7、dent也自动有一个构造方法Person(String,int),但这并不意味着子类不能调用父的构造方法。,13,二、调用父类中特定的构造方法,通过例8.1可知,即使没有明确地指定构造方法,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。但如果父类中有多个构造方法时,如何才能调用父类中某个特定的构造方法呢。其作法就是在子类的构造方法中通过super()来调用父类特定的构造方法。下面举例来说明。见教材例8.2,14,8.1.2 在子类中访问父类的成员,使用super不但可以访问父类的构造方法,还可以访问父类的成员变量和成员方法,但super不能访问在子类中添加的成员。访问父类成员
8、的格式如下: super. super.,【例8.3】在子类中访问父类的成员。 代码见教材,15,8.1.3 覆盖,覆盖(Overriding)的概念与方法的重载相似,它们均是Java“多态”(Polymorphism)的技巧之一。重载的概念已在前一章中介绍过,重载(Overloading)是指在同一个类内定义名称相同,但参数个数或类型不同的方法,因此Java可根据参数的个数或类型的不同来调用相应的方法。而覆盖(Overriding)则是指在子类中,定义名称、参数个数与类型均与父类相同的方法,用以重写父类里同名方法的功能。,16,一、覆盖父类的方法,子类在重新定义父类已有的方法时,应保持与父类
9、完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数类型列表。,17,二、用父类的变量访问子类的成员,通过父类对象也可以访问子类成员。 方法见教材【例8.5】利用父类对象调用子类中成员。,18,8.1.4 不可被继承的成员与最终类,如果父类的成员不希望被子类的成员所覆盖可以将它们声明为final。如果用final来修饰成员变量,则说明该成员变量是最终变量,即常量,程序中的其他部分可以访问,但不能修改。,19,/app8_6.java 父类中的final方法不允许覆盖 class AAA static final double pi=3.14; /声明静态常量 public fina
10、l void show() /声明最终方法 System.out.println(pi=+pi); class BBB extends AAA private int num=100; public void show() /错误,不可覆盖父类的方法 System.out.println(num=+num); ,【例8.6】父类中被声明为final的成员不可被继承。,20,public class app8_6 public static void main(String args ) BBB ex=new BBB(); ex.show(); ,【例8.6】续,21,8.1.5 Object类
11、,在Java语言中有一个特殊类Object,该类是java.lang类库里的一个类,所有的类都是直接或间接地继承该类而得到的。,22,8.2 抽象类,在Java中可以创建专门的类来做为父类,这种类被称为“抽象类”(Abstract class)。抽象类有点类似“模板”的作用,其目的是根据它的格式来创建和修改新的类。,23,8.2.1 抽象类与抽象方法,定义抽象类的语法格式如下: abstract class 类名 声明成员变量; 返回值的数据类型 方法名(参数表) abstract返回值的数据类型 方法名(参数表); ,24,8.2.2 抽象类的应用,由于抽象类的目的是要根据它的格式来创建新的
12、类,所以抽象类里的抽象方法并没有定义处理数据的方法体,而是要保留给由抽象类派生出的新类来定义。 抽象类的应用见教材【例8.10】抽象类的应用举例。,25,8.3 接口,接口(Interface)是Java所提供的另一种重要功能,它的结构与抽象类非常相似。接口本身也具有数据成员与抽象方法。,26,8.3.1 接口的定义,接口定义的语法格式如下: public interface 接口名称 extends 父接口名列表 publicstaticfinal 数据类型 成员变量名=常量; publicabstract 返回值的数据类型 方法名(参数表); ,27,8.3.2 接口的实现与引用,在声明一
13、个类的同时用关键字implements来实现一个接口。接口实现的语法格式为: class 类名称 implements 接口名表 ,28,一个类要实现一个接口时,应注意以下问题: 1非抽象类中不能存在抽象方法。 2一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。 3接口中抽象方法的访问控制修饰符都已指定为public,所以类在实现方法时,必须显示地使用public修饰符。 接口应用例子见教材【例8.11】利用接口建造类。,29,8.3.3 接口的继承,与类相似,接口也有继承性。定义一个接口时可通过extends关键字声明该新接口是某个已存在的父接口的派生接口,它将继承父接口的所有变量
14、与方法。与类的继承不同的是,一个接口可以有一个以上的父接口,它们之间用逗号分隔,形成父接口列表。 接口继承例子见教材【例8.12】接口的继承 。,30,8.3.4 利用接口实现类的多重继承,所谓多重继承,是指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。Java虽不支持多重继承,但可利用接口来实现比多重继承更强的功能。 一个类实现多个接口时,在implements子句中用逗号分隔。 利用接口实现类的多重继承见教材【例8.13】,31,8.4 内部类与匿名类,内部类(Inner Class)是定义在类中的类,内部类的主要作用是将逻辑上相关的类放到一起;而匿名类(Anony
15、mous Class)是一种特殊的内部类,它没有类名,在定义类的同时,就生成该类的一个实例,由于不会在其他地方用到该类,所以不用取名字。,32,8.4.1 内部类,内部类是包含在类中的类,所以内部类也称为“嵌套类”,包含内部类的类又称为“外部类”。其实内部类可以看作是外部类的一个成员,所以内部类也称为“成员类”。,33,/Group.java 内部类与外部类的访问规则内部类外部类 public class Group private int age; /声明外部类的私有成员变量 public class Student /声明内部类 String name; /声明内部类的成员变量 publi
16、c Student(String n,int a) /定义内部类的构造方法 name=n; /访问内部类的成员变量name age=a; /访问外部类的成员变量age public void output() /内部类的成员方法 System.out.println(“姓名:”+this.name+”;年龄:”+age); ,【例8.14】内部类与外部类的访问规则。,34,public void output() /定义外部类的成员方法 Student stu=new Student(“刘 洋”,24); /创建内部类对象stu stu.output(); /通过stu调用内部类的成员方法 public static void main(String args) Group G=new Group(); G.output(); ,