Java语言第7章 接口和抽象

上传人:梦** 文档编号:60559314 上传时间:2018-11-17 格式:PPT 页数:45 大小:220.50KB
返回 下载 相关 举报
Java语言第7章 接口和抽象_第1页
第1页 / 共45页
Java语言第7章 接口和抽象_第2页
第2页 / 共45页
Java语言第7章 接口和抽象_第3页
第3页 / 共45页
Java语言第7章 接口和抽象_第4页
第4页 / 共45页
Java语言第7章 接口和抽象_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《Java语言第7章 接口和抽象》由会员分享,可在线阅读,更多相关《Java语言第7章 接口和抽象(45页珍藏版)》请在金锄头文库上搜索。

1、7.1 接口 7.2 克隆 7.3 内部类 7.4 抽象行为 7.5 抽象类 7.6 抽象与接口的区别,第七章 接口和抽象,7.1 接口,什么是接口呢?在阐述接口的概念以前,我们先举个例子,在日常生活中,我们都会用到插头及插座,一个插座无论是两相的还是三相的,也无论生产插座的厂家是哪里的,都会执行相同的规范,因此当用户购买到插座以后都可以使用。在这里我们关心的是制造插座的规范,并不关心这个插座是用来接电视机或台灯;作为生产插座的厂家关心的也只是制造这个插座过程中所执行的规范,他们只要按照规范生产出来的插座,用户就一定可以正常使用。,7.1 接口,接口本身就类似于上例中的制定插座规范的部门,在接

2、口中声明的行为规范(体现在编程语言中就是方法的声明,只有声明而没有方法体),也就是生产厂家所执行的生产规范,生产厂家对应的就是类,也就是说接口是通过类来实现的。这也正如生产插座的厂家要执行工业部关于插座的生产规范,类也要执行接口中定义的行为规范,也就是方法。,7.1 接口,接口是只说明类应该做什么,但并不指定如何做的方法,一个类可以实现一个或多个接口。在这里再强调一次,接口只是声明应该做,但不关心如何做。,7.1 接口,接口在Java中是用关键字interface来声明的。所以说接口并不是一个类,而是对符合接口需求的类的一套规范。 public interface Person String

3、getName(); String getSex(); String getBirthday(); String getAddress(); void setAddress(String strAddress); ,7.1 接口,接口标识符的声明与类标识符的声明一致,接口开头的第一个字符习惯上也是大写。 仔细观察这段代码会发现,在方法的声明中,我们没有声明访问控制符,这是因为接口都是public型的,接口中的方法自动的也全部都是public型的,所以不需要再在方法声明中使用public关键字。试想,如果把接口声明为其他的访问控制符,那根本没有任何的意义,所以接口只能是public型的。,7.1

4、 接口,实现一个接口是指类实现一个接口,基本上类似于类的继承,但接口的实现是通过关键字implements来实现的。 实现接口的类,必须要实现接口中的所有方法。,7.1 接口,观察我们所写的代码,在Student类中功能与接口中声明的方法一致,我们做了一些修改,与以前的Sutdent类有所不同了,并且完成了方法,以明确告诉程序如何操作,如getName方法,在接口中只是声明为返回一个字符串,而在实现接口的类(Student类)中我们却明确告诉返回的是学生的姓名。如果是工人类实现了Person接口,那就应该返回工人的姓名。 现在我们再把getName方法修改一下,使之还原到原来的样子,代码如下:

5、 public String getStudentName() return strName; ,7.1 接口,现在我们再把在类实现中实现了接口的方法修改一下,将访问控制符由public改为别的控制符,代码如下: protected String getSex() return strSex; ,7.1 接口,由此我们可以总结出以下三点: 声明类需要实现指定的接口; 提供接口中所有方法的定义; 实现类中在接口中定义的方法必须全部都是public的。,7.1 接口,在前面我们提到过,一个类可以实现多个接口,正如一个工厂可以生产多种产品,执行不同的生产规范一样的道理。 如果一个类实现多个接口,也是

6、用关键字implements来实现的,多个接口之间用逗号“,”来分隔。 我们就以一个具体的例子来探讨一下接口的多重实现,并学习如何利用Java公开库中的接口。假设一个班级中有50个学生,我们想实现学生间按照学号进行排序。 在Arrays类中有一个静态的方法: public static void sort(Object a),7.1 接口,我们再看一下Comparable接口的API文档,可以看到在接口中只有一个方法的声明,那就是 public int compareTo(Object o),7.1 接口,那么Comparable接口看起来同下面的代码类似: public interface

7、Comparable int compareTo(Object other); ,7.1 接口,我们先让学生类实现Person接口的同时再实现Comparable接口,那在学生类中应该再追加一个CompareTo方法。代码如下: class Student implements Person, Comparable public int compareTo(Object other) ,7.1 接口,接口的属性 接口不是一个类,因此永远不能用关键字new来生成一个接口的实例。 x = new Comparable();/这是错误的 虽然我们不可以实例化一个接口,但可以声明一个接口的变量: Co

8、mparable x;/这是完全可以的 既然是变量总要指向一个对象,那接口变量应该指向什么对象呢?接口变量必须指向一个实现了该接口的类的对象。也就是必须用接口的实现类来代替接口的实例。,7.1 接口,如在例7-2中,我们可以用 Person x = new Student( ); 也可以用 Comparable x = new Student( ); 至于在程序中究竟该用哪一个接口来作为形式类型,那要根据具体情况具体分析。,7.1 接口,一个类只有一个父类,但一个类可以实现多个接口,这样在设计一个类的时候,就可以有很大的灵活性了。在Java中有一个内建的历史学家重要的接口,它就是Cloneab

9、le(可克隆的,我们将在本章中详细讲述)。如果实现了这个接口,那么可以调用Object类中的clone方法实现这个类对象的一个精确拷贝。,7.1 接口,既然接口具有类的某些属性,那我们也可以像类一样,从一个接口中派生出另一个或几个接口,这是一个从通用性到专门性的扩展过程。接口的继承和类的继承一样也是用关键字extends来实现的。,7.1 接口,例如,由于每一个人年满18岁就会拥有一张具有惟一编号的身份证号码,所以我们再从Person接口派生出一个成人(AdultPerson)的接口,它又追加两个方法声明,代码如下: public interface AdultPerson extends P

10、erson String getIdentityCardNumber(); void setIdentityCardNumber(String strNumber); ,7.1 接口,关于接口的意义及灵活性,在前面已经多处做了说明,从Java编程语言横向的角度上说明一下接口的意义。在本小节中提到的一些概念大家可能并不了解,这没有关系,我们只是说明一个问题。 如果读者以后走上了Java程序员的道路,需要学习更多的内容,如JSP、EJB等,如果读者能从事手机嵌入式开发,那就必须要学习J2ME等内容。学习这些内容接触最多的就是接口,例如EJB2.0中,设计一个EJB需要设计4个接口1个类,也就是说只

11、有一个类是真正有用的,其他的只是接口,正是由于接口的存在增强了EJB的灵活性。,7.2 克隆,对于对象类型在做变量的传递时,我们知道实际上做了一个对象地址的拷贝,对象并没有改变,也就是说两个变量指向同一个对象,当我们改变其中一个变量时,另外一个也会受到影响。例如: Student tom = new Student(“Tom“, “20021024“); Student tomCopy = tom; tomCopy.setAddress(“American“);,7.2 克隆,7.2 克隆,如果你想拷贝一个新对象,而该对象的初始状态同源值是相同的,但可以独立变化,不会因为一个变量的操作,而影响

12、到另外一个变量,那就需要用到clone(克隆)方法。这个方法属于Object类,它返回的是一个Object对象,所以如果想获得正确的类型需要进行类型的转换。例如: Student tom = new Student(“Tom“, “20021024“); Student tomCopy = (Student)tom.clone(); tomCopy.setAddress(“American“);,7.2 克隆,public Object clone() try return super.clone(); catch(CloneNotSupportedException e) return nu

13、ll; ,7.2 克隆,虽然我们在代码中运用了对象类型:字符串(String)类型,但字符串是不可变的,所以并没有出现问题。因此,在以下两种情况下做第一种的拷贝是没有问题的:子对象可能属于一个不可改变的类,如String等;另一种情况就是子对象在生存期内只有常量,它不会改变并且没有方法会引用它。 然而在通常情况下,子对象是可变的,我们会出现例7-4所示的情况。在图7-3所示的情况我们习惯上称为浅拷贝,如果在被拷贝的对象类型中存在其他可变对象的引用,我们称之为深拷贝。,7.2 克隆,所谓深拷贝也就是说会出现如图7-3所示的情况:,7.2 克隆,public Object clone() try

14、Student cloned = (Student)super.clone(); cloned.entryDate = (GregorianCalendar)entryDate.clone(); return cloned; catch(CloneNotSupportedException e) return null; ,7.3 内部类,所谓内部类,故名思义就是定义在一个类内部的类。创建一个内部类很简单,如: class Student class Course ,7.3 内部类,虽然创建一个内部类很简单,但真正将内部类运用好,也是一件十分不容易的事情,因为在设计一些类时,并没有明显的特征使

15、我们会立刻想到运用内部类。,7.3 内部类,class Course private String strCourse;/学生课程的数组 public Course(String strCourse) this.strCourse = strCourse; ,7.3 内部类,内部类Course有一个构造器,可以每次设定学生所学习的课程,当然在内部类的里面根据需要将会添加一些方法,以便做一些更加具体的事情,,7.3 内部类,内部类与外部类的称呼是相对的,如果一个类包含另一个类,习惯上我们称里面的为内部类,相对于内部类来讲,包含它的类称为外部类。并不是说一个类只能包含一个内部类,在内部类中如果需要

16、仍然可以再设计内部类,那第二层的类相当于最里面的类来讲就是外部类了。,7.3 内部类,在这里,我们仔细分析一下上面的代码。在Course类中能够访问它本身的实例字段,即字符串数组,但在Course类中并没有定义strName与strNumber字段,而是指向了创建Course类实例的Student对象的strName与strNumber字段,就像是访问它本身的数据一样,虽然strName与strNumber字段是私有的,但作为内部类仍然是可以访问的。,7.3 内部类,关于这方面知识的详细情况,如果读者不熟悉,请参阅第6章相关的内容。那作为内部类又是如何去实现这个隐含的引用呢?难道还是通过this关键字吗? 虽然内部类并不是通过关键字this来实现引用的,但也与this有一定的关系,因为this关键字暗含的是类本身的引用,那么作为外部类来讲,我们可以采用外部类名与this相结合,实现这种隐藏的引用

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

当前位置:首页 > 高等教育 > 大学课件

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