Java基础05 实施接口(转载)
经过封装,产品隐藏了内部细节,只提供给用户接口(interface)。
interface
interfase Cup{
void addWater(int w);
void drinkWater(int w);
}
Cup这个interface中定义了两个方法的原型(stereotype): addWater()和drinkWater()。一个方法的原型规定了方法名,参数列表和返回类型。原型可以告诉外部如何使用这些方法。
在interface中,我们
- 不需要定义方法的主体
- 不需要说明方法的可见性
注意第二点,interface中的方法默认为public。正如我们在封装与接口中讲到的,一个类的public方法构成了接口。所以,所有出现在interface中的方法都默认为public。
我们可以在一个类的定义中实施接口,比如下面的MusicCup (可以播放音乐的杯子):
public void addWater(int w){
this.water = this.water + w;
}
public void drinkWater(int w){
this.water = this.water - w;
}
private int water = 0;
}
我们用implements关键字来实施interface。一旦在类中实施了某个interface,必须在该类中定义interface的所有方法(addWater()和drinkWater())。类中的方法需要与interface中的方法原型相符。否则,Java将报错。
在类中可以定义interface没有提及的其他public方法。也就是说,interface规定一个必须要实施的最小接口。比如下面的waterContent()方法就没有在Cup接口中规定原型:
class MusicCup implements Cup{
public void addWater(int w){
this.water = this.water + w;
}
public void drinkWater(int w){
this.water = this.water - w;
}
public void waterContent(){
return this.water;
}
private int water = 0;
}
分离接口的意义
我们使用了interface,但这个interface并没有减少我们定义类时的工作量。我们依然要像之前一样,具体的编写类。我们甚至于要更加小心,不能违反了interface的规定。既然如此,我们为什么要使用interface呢?
事实上,interface就像是行业标准。一个工厂(类)可以采纳行业标准 (implement interface),也可以不采纳行业标准。但是,一个采纳了行业标准的产品将有下面的好处:
- 更高质量: 没有加水功能的杯子不符合标准。
- 更容易推广: 正如电脑上的USB接口一样,下游产品可以更容易衔接。
如果我们已经有一个Java程序,用于处理符合Cup接口的对象,比如领小朋友喝水。那么,只要我们确定,我们给小朋友的杯子(对象)实施了Cup接口,就可以确保小朋友可以执行喝水这个动作了。至于这个杯子(对象)是如何具体定义喝水这个动作的,我们就可以留给相应的类自行决定 (比如用吸管喝水,或者开一个小口喝水)。
在计算机科学中,接口是很重要的概念。比如任何提供UNIX接口的操作系统都可以称作UNIX系统。Linux,Mac OS,Solaris都是UNIX系统,它们提供相似的接口。但是,各个系统的具体实施(源代码)互不相同。Linux是开源的,你可以查看它的每一行代码,但你还是不知道如何去编写一个Solaris系统。
实施多个接口
interface MusicPlayer(){
void play();
}
class MusicCup implements MusicPlayer,Cup{
public void addWater(int w){
this.water = this.water + w;
}
public void drinkWater(int w){
this.water = this.water - w;
}
public void play(){
System.out.println("la..la..la..");
}
private int water = 0;
}
最新文章
- AC自动机小结
- 每日Scrum(2)
- mysql入门语句10条
- 使用ajax登录格式
- C# winform中的datagridview控件标头加入checkbox,实现全选功能。
- Web程序设计笔记-第一章:基础知识
- ruby -- 进阶学习(十六)ckeditor去除“浏览服务器”按钮
- SVN 的使用
- Swift不可变数组
- sql语法图
- Cookie 添加,读取,删除
- (转)OS X 升級後 MacPorts 重新安裝筆記
- ACE编译
- LINQ里的“equals”和“==”的区别
- linux centos下安装g++
- [转载]Word直接发布新浪博客(以Word 2013为例)
- Python数据类型的内置函数之tuple(元组),dict(字典),set(集合)
- Java线程中的join使用实例
- Excel:LOOKUP函数的经典用法
- View的setTag和getTag方法
热门文章
- iOS 中json解析数据出现中文乱码的问题
- 64个命令,每天一个linux命令目录, shutdown,tee,rcp,
- ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
- 自建Saltstack的repo软件源仓库
- openstack学习笔记(一)-openstack的基础知识
- mongodb聚合(转)
- cinemachine unity
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
- React的设计哲学 - 简单之美
- lodash 提取前N个元素 take