Java程序设计-7-继承和接口

上传人:豆浆 文档编号:26058089 上传时间:2017-12-22 格式:PPT 页数:62 大小:873KB
返回 下载 相关 举报
Java程序设计-7-继承和接口_第1页
第1页 / 共62页
Java程序设计-7-继承和接口_第2页
第2页 / 共62页
Java程序设计-7-继承和接口_第3页
第3页 / 共62页
Java程序设计-7-继承和接口_第4页
第4页 / 共62页
Java程序设计-7-继承和接口_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《Java程序设计-7-继承和接口》由会员分享,可在线阅读,更多相关《Java程序设计-7-继承和接口(62页珍藏版)》请在金锄头文库上搜索。

1、Java程序设计,第七章 继承、接口,学习目标,理解继承的含义以及类的层次关系理解抽象类和具体类的区别理解多态的含义以及如何实现多态理解类型系统理解接口以及实现接口理解接口和抽象的区别理解基本的设计模式和实现掌握Object类,掌握主要方法的作用理解对象相等性的判断机制,继承是自然界的一种普遍现象。作为面向对象技术的实现,Java提供了通过继承创建新类来实现类的重用,在清晰的描述问题域的层次体系时,继承有着重要的作用。作为系统建模的一种主要原则,理解继承的关键在于能够认识抽象的作用。本质上接口是一种设计模式,它和继承还有着一定的区别,在开发中它的使用更加频繁。作为本章的另外一个重要内容,类型的

2、转换机制也是需要认真领会的。,7.1 类的层次结构,层次是我们生活中经常可见的一种结构。例如一个企业通常有着明晰的组织结构,除了这种组织结构外,另外一种典型的层次结构就是分类结构了,例如有关生物的分类:,在Java语言中,所有的类都有着严格的层次体系,除了根类,每个类都有着唯一的超类,7.2 创建现有类的子类,从Java编程语言的角度来看,继承发生在一个被称为“超类”(或者称为“基类”superclass)与一个被称为“子类”(subclass)之间,用extends来实现,如:class ChildClass extends SuperClass/.这里表示子类ChildClass派生于超类

3、SuperClass。准确的说,我们创建了属于SuperClass类的一个新的子类型。在发生继承关系时,一个子类对于超类的继承表现在以下几个方面:继承超类的属性继承超类的方法 使用超类的构造函数,1.继承超类的属性一个子类继承超类的属性之后能否使用取决于超类属性的访问属性以及子类和超类所属包的关系,图5-3说明了这个问题。,根据继承规则,如图7-3中显示的那样:当超类和子类在同一包中时,子类可以继承(既可以直接使用)超类中除private修饰的一切属性而当超类和子类不在同一个包内时,子类除了超类中用private修饰的属性不能继承外,超类中那些没有明确访问范围的属性也不能被继承。所以,当明确一

4、个类需要作为基类来使用时,考虑清楚每一个数据成员的访问范围是很重要的。,2.继承超类的方法子类对于超类方法(不包括超类的构造函数)的继承规则和上述的属性继承规则一样。在超类中被说明为private的方法不能被子类继承使用,那些没有说明访问范围的方法,只有当子类和超类在一个包内才可以被继承使用,除此之外,超类的其它方法都可以被子类继承使用。,7.2.2 使用super访问超类的构造方法,使用超类的构造方法 构造方法不同于一般的方法,子类无法使用超类的构造方法作为自己的构造方法,子类必须有自己的构造方法,但可以使用父类的构造方法,形式是。super(x,);调用父类构造方法时应遵循的原则:只能在子

5、类中调用父类的构造方法,而且必须是第一条语句,即不要在父类构造方法前放任何子类构造方法代码.调用父类构造方法时,必须使用super()。如果父类没有显式声明构造方法,则子类中可以不用调用父类构造方法,但也可调用父类默认的无参数的构造方法,形式如super(),一个超类,public class Student String studentid; /学生编号 String name; /学生姓名 String speciality; /专业 public Student(String studentid, String name) this.studentid = studentid; this

6、.name = name; /分配专业 public void assignSpeciality(String speciality) this.speciality=speciality; /定义该对象的字符串表示 public String toString() return studentid+, +name+, + speciality; ,一个继承于Student的子类,public class Postgraduate extends Student String orientation; /增加了研究方向 public Postgraduate(String studentid,

7、 String name, String orientation) super(studentid, name); /调用超类Student的构造函数 this.orientation = orientation; public void changeOrientation(String nweOrientation) /变更研究方向 this.orientation=nweOrientation;public static void main(String args0) Postgraduate student=new Postgraduate(001,Zhang-hua,AI); stud

8、ent.assignSpeciality(Computer Science); System.out.println(student); /默认执行超类的toString(),图5-4形象的说明了在创建一个研究生对象student时,超类和子类的关系。在子类的构造函数中的第一行就是super(studentid, name)表示这里要调用超类的构造函数,读者可以想象为创建一个超类的对象,然后子类就可以像使用自己的属性和方法一样使用这个超类对象的属性和方法,对于子类对象外部是无法知道这样的区别的。如果在子类Postgraduate的构造函数中没有这么一行,在编译中是无法通过的。,Implicit

9、 super constructor Student() is undefined. Must explicitly invoke another constructor。,这句话翻译过来就是,隐含的超类构造函数Student()并没有定义,程序必须明确的调用另一个构造函数。错误的原因是因为子类构造函数中并没有包括一行调用超类构造函数的语句,导致无法创建一个属于超类的对象。,Implicit super constructor Student() is undefined. Must explicitly invoke another constructor。,一点提示:通过程序运行结果和图示

10、关系,可以知道Postgraduate继承了Student类的所有内容,也就是说,在Postgraduate类的定义中已经把Student的所有定义,包括属性、方法都给包含了进来,这时Postgraduate对象所继承的Student的方法处理的内容已经完全依赖于当前对象(Postgraduate)。在某种程度上,读者可以理解为Postgraduate对象体内包含了一个完整的Student对象,但这个Student类型的对象的属性值则有创建子类对象时来提供。,继承是面向对象编程的主要优点,总的来说,继承是面向对象编程的一个主要优点之一,它对如何设计Java类有着直接的影响。继承有如下几点好处:

11、它可以利用已有的类来创建自己的类,只需要指出自己的类和已有的其他的类有什么不同即可,而且还可以动态访问其他有关的类中的信息。通过继承,可以利用Java类库所提供的丰富而有用的类,这些类都已经被很好地实现。当设计很大的程序时,继承可以使程序组织得更加层次清晰,有利于程序设计和减少错误的发生。,7.2.3 覆盖和隐藏机制-override,图7-4显示,子类总是比超类内容要多一些,这反映了它们之间的扩展关系,主要体现在两个方面:子类在继承超类定义的同时,可以添加属于子类特有的属性、方法和构造函数。子类在继承超类定义的同时,可以重新修改超类中原有定义的属性和方法,这种现象称为覆盖-override。

12、在子类中添加新的属性、方法和构造函数读者应该很熟悉了,它和前面介绍的有关类的定义没有任何区别。这里需要重点了解的就是在继承的同时,修改继承于超类的属性和方法。,1.覆盖超类的方法 基本上,重写继承超类的方法存在以下主要原因:超类是抽象的,继承的方法也是抽象的,需要在子类中为之添加必要的实现代码。子类中的方法需要完成额外的工作,如toString()。提供更好的实现算法,如子类中的某种数据结构发生了变化,可以采取更好的算法实现优化。覆盖超类的方法变化变更方法的可见范围,可以不变、扩大可见范围,不可缩小。例如某个超类的方法的访问控制修饰符是protected,而子类中为public。方法的返回值类

13、型可以改为原方法返回类型的子类(1.5中可以覆盖)无法重新定义Static方法,1.覆盖超类的方法 (续)Java运行时系统根据调用该方法的实例的类型来决定调用哪个实现。需要注意的是,子类覆盖了超类的某些方法,并不意味着继承于超类的原方法就不存在了,实际上还存在,通过特殊的方法可以使用(参见5.2.3),但对于通过子类的对象调用这个同名的方法时,只能使用新的方法。,2.隐藏数据成员开发人员除了可以在子类中重写继承自超类的方法外,也可以在子类中定义和超类同名的属性,这种情况很少出现,偶尔也会有这样的事情发生,这可能是由于开发人员不希望继承自超类的成员变量被访问,或者不希望修改继承于超类的代码,而

14、重新定义属性的新用途。如果改变了超类属性的含义及用途,最好的办法是定义新的属性,避免出现误解。当子类中定义了和超类同名的成员变量时,在子类引用该变量名时,使用的总是子类的定义,来自超类的成员变量被直接隐藏,至于如何使用继承自超类的成员变量,请参考5.2.3有关内容。,使用super访问被覆盖的方法或隐藏数据成员在子类中调用超类的构造函数在子类中调用被重写的超类方法在子类中引用被隐藏的超类属性,单继承和多继承,在自然界中,一个子类同时继承多个超类是很常见的现象,多重继承可以更真实的表达现实,但是它比较复杂,很容易出现属性冲突、重复继承的情况,使得开发更加困难,因此,Java语言使用了单继承,每个

15、类只能有一个超类。在实际中,不要过度使用继承关系,可以通过复合使用属性来替代,例如在Student中可以添加status这样的属性表示一个对象是本科生还是研究生;创建子类的时候,应该明确子类是超类的一个类型,而不是为了继承而创建;在创建子类时,应尽量只添加新的特性,而不要隐藏、重新解释超类特性,课堂练习,类之间的关系除了聚合和关联外,还有继承,请用UML符号描述下述类之间的关系。账户和存款帐户学生和人水果和橙子教师和课程班级和学生解释方法覆盖和重载的区别.,7.3 Object类、抽象类、final类,7.3.1 根类Object,public class Objectpublic Objec

16、t()public final Class getClass()public int hashCode()public boolean equals(Object obj) protected Object clone() throws CloneNotSupportedExceptionpublic String toString()public final void notify()public final void notifyAll()public final void wait() throws InterruptedExceptionprotected void finalize() throws Throwable,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号