设为首页
收藏本站
开启辅助访问
切换到窄版
登录
立即注册
中问网首页
我的收藏
站长博客
搜索
搜索
本版
帖子
用户
第一问答网
»
论坛
›
中问网
›
问答
›
理解java中接口
返回列表
发新帖
理解java中接口
[复制链接]
11
|
0
|
2006-8-10 17:07:00
|
显示全部楼层
|
阅读模式
好的面向对象编程要求类设计人员隐藏那些不需要类的使用人员了解的信息。对于 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方法将永远不能工作。
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
千问
主题
0
回帖
4882万
积分
论坛元老
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
论坛元老, 积分 48824836, 距离下一级还需 -38824837 积分
积分
48824836
加好友
发消息
回复楼主
返回列表
问答
热门排行
1
什么事二型糖尿病
2
治疗蕁麻媜的中成药有哪些?
3
睡到半夜常醒来怎么办
4
我的妈妈得了糖尿病,她平时也没什么特别的爱好,就是喜欢无聊闲时的时候品尝茶
5
有时候突然感觉胸闷,喘不过气
6
产后3个月白带查出清洁度3度 盆腔积液9MM宫颈管
7
去年9月开始月经就不2月左右来一次,2012年1月初来后至今没来月
8
刚开始有一点白头,涂了4天后,白头没了,
9
新生儿血红细胞偏高是什么原因,会导致什么
10
68岁,女,春节至现在全身浮肿、疼痛、乏
11
18天的宝宝有点感冒鼻塞好像有痰一样
12
患胆囊癌肝转移,现放疗出现腿肿是什么原因
13
我想知道山药豆长芽还能吃吗
14
宝宝八个多月老是咳嗽流鼻涕,看医生说是气
15
没有什么病只是减肥红糖胡
16
好一阵子了总感觉浑身没劲,又特别怕冷.
17
这个小孩能否保住
18
我胃痛而且胀痛.不知道怎么回事!已经很久
19
请问有什么办法治疗近视?
20
喝中药在饮食应注意什么
21
不运动没有太大感觉有时感到心累,发现8年了
22
天冷流鼻涕咳嗽转黄痰后开了神苗小儿清肺颗
23
我想问下,我是上个月22号来的例假,到今
24
一吃鈑不香全身无力左腿无力
25
我父亲最近一个月老失眠,吃佐匹克隆片后情
26
子宫内膜增厚的危害?
27
直肠癌中晚期,手术后,症状:肛门接口疼痛
28
3天前,右肩部突然鼓起一个核桃大的硬块,当时右臂疼痛不能活动
29
我大腿旁边长了两个包,很痒,小指甲大小,
30
喉咙干痛欲裂,今天又有点鼻塞,没发烧没流
31
先天性心脏病动脉导管未必
32
出虚汗,痛经
33
医生您好!请问近日鼻腔流出黄色腥臭液体,
34
月经停了一年咋办
35
我的眼睛有有点散光,看东西有点重影,用眼
36
孩子牙龈起了个包,到底是怎么回事?怎样治
37
患子宫肌瘤在经期会头痛牙疼淋巴痛吗
38
之前脸部过敏,用药后,现在用药部分色素沉
39
顺产后一个用同房,见红
40
我最近就是跳绳的时候有尿跳出来正常吗
41
您好!扁桃体发炎可以吃羊肉吗?
42
嗓子卡鱼翅怎么办
43
孩子经常吸嗓子怎么办是什么原因呀
44
脖子上有小痘痘身上有少许红点
45
宝宝8个月了,长了鹅口疮怎么办?
46
我是今年一月七日测空腹血糖9.17三月三
47
我的耳朵充血怎么办?
48
怀孕一个多月有恶心,吃过饭肚子胀
49
吃了一次毓婷后,月经提前半个月来了,而且
50
宝宝肚子咕咕叫,晚上爱哭
51
月经前4,5天有少量黑色物排出,之后正常
52
指甲尖部有红竖纹,怎么回事
53
药物流产四五天左右才不流血,彩超检查宫腔
54
这方能治腰椎间盘突出吗?
55
孩子肠系膜淋巴结肿大,已经输液5天,还是
56
肠胃科周六有没有专家上班,床位还有没有
57
我一直都没来例假,请问正常吗?
58
脸颧骨处被撞已经第六局部还有些疼痛,眼睛下方一个指甲盖大小的青
59
您好!本人怀孕周,想求助便秘调理方法,还
60
你好我想问一下就是那个带雄黄可以生男孩的
61
为什么第一次我的第一次不见血呢?
62
绝经补雌激素
63
咳嗽一个月了。打了点滴吃了药。本来快好了
64
我朋友太阳穴下面两侧起软包该挂那科?包还
65
幽罗门杆菌检查在胃不疼时候还需要检查吗?
66
空腹血糖8.1,光用血糖仪测能诊断是糖尿
67
患有慢性胃炎伴糜烂服用啥药效果好
68
头上有白发了,多数的是全白,有的上黑下白
69
两个月的小孩子咳嗽
70
医生你好!我之前咨询过关于饮酒怀孕的事。
71
孕妇能用儿童霜吗???????????
72
射精稍稍擦拭后又将阴茎插入女友阴道内,没
73
黄酮体针剂一针多少钱,大约打几针呢?有没
74
乳房小 ,乳房变大 ,无异常
75
脚踝不消肿
76
尖锐湿疣有没有用药一个月没有变化的病例?
77
一道下午就脸发烫。发紫
78
为什么胆汁返流左侧位睡觉好?
79
我现在是鼻窦炎或额窦炎吗。臭味,回咽喉,
80
怀孕八个月了瘙痒两个星期了 ,没有治疗 ,想知道这是不是一种疾病
81
什么检查排除淋病
82
请你帮我看下我的骨骺线有没有闭合,谢谢啦
83
我女儿快五岁了,最近几天发现两个咪咪头里
84
子宫内膜增厚吃什么药治?
85
宝宝昨天晚上6点发烧38.3给吃了退烧药
86
生姜可以治疗白癜风
87
一般情况下。几天才能看到胎囊???
88
我和我的妻子都是A型血,生出的孩子会不会
89
请问果汁能不能加热,如果加热多少度才可以
90
请问怀孕两个月的时候吃过一片米非司酮片,
91
嘴角有胡须,影响美观
92
感觉头有点疼,做磁共振检查出来是脑积水,
93
我上个月月经是2.6来的,在3.4试纸检
94
心跳很快,没力气,晚上睡觉的时候感觉新题
95
阴茎头上有一小片好像烧着了一不疼不痒!
96
上吉妮环以后还能怀孕吗
97
我2月6号来的月经,25号同房,然后29