好的面向对象编程要求类设计人员隐藏那些不需要类的使用人员了解的信息。对于 Java 编程语言,这样的访问可以通过使用关键字 private, protected, 和 public来控制。这些关键字控制类内部的变量和方法是否可见,但是不好的类设计导致太多的可见信息和方法没有被很好的封装。
封装的一种方式是通过使用接口(Interface)实现的。接口提供一种途径,使类隐藏其处理的特定事物的细节,仅对外公布它必须支持的属性。对于编程所涉及的,你可以修改类的实现,而不修改它的调用,因为属性本身没有改变,修改的仅仅是类的实现。
一个接口被经常用得到的地方是Collection Framework。这个框架定义了一组非常重要的接口,它们是由一组多个类实现的。通过仅仅研究主要的接口,你可以有效的掌握整个框架,因为特别的实现类一般不影响设计的整体。
例如,List接口定义了一个有序的元素集合。可用地实现包括ArrayList和LinkedList,它们都实现了List接口。当你的程序需要处理List时,不必考虑它是ArrayList还是LinkedList,只要知道所选用的类的属性即可。这个属性就是接口。
通过实现类的接口,并且在类设计时仅对外公布接口,你就有效的封装了类的定义,这样后台实现的变动将对系统其它部分的影响最小。
以ArrayList和LinkedList为例。将ArrayList看作一个可增长的数组对象(指是存储对象,而不是原始数据)。当类实现了List的全部接口时,它的特性在特定条件下是可以优化的。
例如,如果你的程序是要队列表中的数据进行频繁的随机访问,(例如,显示第3,12,2,和25项数据)ArrayList类提供对列表中每一个数据快速查询。快速查询是以在列表中间添加和删除数据的速度为代价的。如果后一种行为是你需要的,那么LinkedList类是一个好的选择。它提供快速的顺序访问、添加和删除,但是,代价是慢速随机查询。
在处理ArrayList和LinkedList时,有两种方式创建对象:
List cityList = new ArrayList() ;
LinkedList peopleList = new LinkedList() ;
两个代码段都是正确的,但是这两行代码之间存在的显著的差别。第一行表示我们要创建一个ArrayList,但是我们只需要把它作为一个List来访问。第二行正好相反。是,LinkedList项目被创建了,ArrayList也一样。但是,声明部分说明它只能作为LinkedList来访问,这就数它的最大区别。
理解接口真正变的重要是在这两行代码的用户确定“查询项目n”比在位置m处删除(或添加)项目更为重要时。
PeopleList变量被声明为LinkedList类型。这不是它本身的问题,因为你研究的更深层次的内容,你将发现peopleList在任何地方都被作为LinkedList对象处理。在你对peopleList使用LinkedList特有的方法的同时,如果你想把它作为ArrayList来处理,将会出现问题。
List peopleList = new ArrayList() ;
通过学习仅使用接口来处理任何对象,你将发现在设计完成之后修改实现,你需要修改的仅仅是声明部分,除此之外,没有任何代码改动。这就是接口的绝妙之处。因为类的最初声明是LinkedList,当类型变为List时意味着象addFirst或addLast这样的方法是无效的,因为新的peopleList的类型是List,它没有这些方法。
这种基于接口设计的代码,就像Collection Framework所向大家承诺的那样,任何人编写的代码是以循环构造方式进行的,而无需知道使用的是哪个Collection。创建的类是被限制为提供接口的完全实现。除此之外,新代码将不能被编译。
作为实例,下面的程序创建一组集合。每个集合提供一个系统定义的Iterator这样集合的每个元素可以被访问。这个iterator将被传递到帮助例程,在这里集合的独立元素将被打印。
import java.util.*; public class Interfaces { public static void main(String args[]) { Properties props = System.getProperties(); Set keySet = props.keySet(); dumpIterator(keySet.iterator()); List list = Arrays.asList(args); dumpIterator(list.iterator()); } private static void dumpIterator(Iterator itor) { // System.out.println(itor.getClass().getName()); while (itor.hasNext()) { System.out.println(">> " + itor.next()); } System.out.println("----"); } }
类Iterator的类型是unknown,这正是接口的绝妙之处,而不是问题。真正的事实是iterator方法返回的是一个真实的Iterator对象。然而,dumpIterator通常提供接口的完全实现。
如果你去掉dumpIterator中的println行的注释,你将发现真实的iterator类名,对Properties是Hashtable.Enumerator而List是AbstractList.Itr。这个事实不必知道,也不会对你的程序有任何帮助。真正重要的是List和Properties的iterator方法所返回的任何对象,必须实现java.util.Iterator:hasNext, next和remove方法。没有这三种方法中任何两种,dumpIterator方法将永远不能工作。
|
相关推荐
简单理解接口回调的概念。通过接口来交互或者传递数据,activity和fragment。
通过简单的自定义Dialog来理解接口回调callback机制
这段代码用于学习接口时,更加深刻理解接口静态、默认(可重写)、接口中的方法、多实现、多继承等知识点。
定义三个实现接口的类,实现的方法不同,new哪个类就执行哪个类的方法;
如何理解接口的作用? 继承是存在于面向对象程序中两个类之间的一种关系。使用继承的主要优点是使程序结构清晰,降低编码和维护的工作量。JAVA中不支持多重继承,而是通过接口实现比多重继承更强的功能,Java通过...
java 接口java 接口java 接口java 接口java 接口java 接口java 接口
2、掌握和理解接口实现多态的运用。 3、理解和掌握匿名类的用法。 4、初步了解JDK8新特性和lambda表达式。 二、实验内容和主要步骤 ★专题:继承基础和面向抽象编程★ 1.继承基础实验 2.Object类使用 3.抽象类和...
第一步:理解业务需求,一般来说可以从需求理解接口的行为和描述,行为:当什么情况,做什么操作,发生什么事情。描述:情况是什么,操作是什么等。 第二步:查看(评审)接口文档的入参和返回是不是符合需求描述。 ...
要理解接口和抽象类的选择原则,有两个概念很重要:对象的行为和对象的实现。如果一个实体可以有多种实现方式,则在设计实体行为的描述方式时,应当达到这样一个目标:在使用实体的时候,无需详细了解实体行为的...
当一个C程序在RTL中被使用时,C的参数就被合成到RTL的数据口,接口合成允许一个接口被加入到RTL的数据口,这样接口控制能够被简化为一个输出的有效信号表明当一个输出已经就绪能够通过一个块RAM包含所有的接口,从而...
通过本例子理解工厂模式和面向接口编程,并更好理解接口的使用
1. 设计并使用抽象类; 2.学习如何定义接口,掌握接口的实现方式,使用实现了接口的类; 3.理解接口与抽象类的区别。
现代计算机接口技术及MFC程序实现,通过它可以轻松理解接口技术
java中的抽象类和接口的理解及abstract的使用方法!
基于python的接口自动化测试框架讲解用PPT,为了能让学员更好的理解接口自动化测试框架的PPT。
1.理解接口的意义 2.掌握接口的C#实现
操作系统 理解面向操作命令的接口Shell。
接口回调示例 简单好用 而且易懂 更能帮助你理解接口回调的机制