接口(英文:Interface)是Java中非常重要的内容,初学的时候可能感受不深,但是在做项目的时候,对面向接口编程的运用就变得尤为重要,不过这是后话了。现在先讨论假如是刚刚接触接口这个概念,该怎么玩?如果是看过我之前文章的朋友应该了解,在遇到一个新概念的时候,我一般思考框架是先问下面三个问题:

1.这个东西有什么用?用来干什么的?它的意义在哪里?(显然,如果是没用的东西,就没必要浪费时间了;其实,弄懂了这个问题,就掌握了50%)

2.这个概念或者技能点怎么用?也就是它的表现形式,如关键字、修饰词、语法什么的。。。(这个占20%)

3.这个东西在用的过程中,有哪些关键点和细节点?(这个占30%)

上面三个问题搞清楚了,剩下的就是去用了。。。“无他,但手熟尔。”

一、接口有什么用?它的意义在哪里?

回答这个问题,两句话就够了:

1.接口表示一种能力;

2.接口表示一种约定。

先来看第一点“接口表示一种能力”,举个栗子:

需求:现在要创造一个蜘蛛侠。人有“唱歌”和“考试”的功能,蜘蛛有“爬行”和“吐丝”的功能。

分析:首先蜘蛛侠是一个人,他有蜘蛛的能力。按照面向对象思想,可以将人和蜘蛛分别定义成抽象类。但是,不能让蜘蛛侠在继承人的同时又继承蜘蛛。两个原因:一、蜘蛛侠不是蜘蛛,不符合继承中 【is a】的关系;二、Java只支持单继承。如何解决这个问题呢?这时就要用到接口,接口是【has a】的关系。可以将蜘蛛的行为能力定义为接口,让蜘蛛侠继承人,实现蜘蛛的行为能力的接口。实现代码如下:

1 public abstract class Person {        //定义Person抽象类 2     public abstract void sing();    //唱歌抽象方法 3     public abstract void exam();    //考试抽象方法 4 } 5 public interface ISpiderable {            //定义一个蜘蛛的行为能力接口 6     public abstract void creep();        //爬行抽象方法 7     public abstract void shootWeb();    //吐丝抽象方法 8 } 9 public class SpiderMan extends Person implements ISpiderable{//继承人,实现蜘蛛的行为能力接口10     String name = "彼得·帕克";11 12     @Override13     public void creep() {                    //实现爬行方法14         System.out.println(name + " 在屋顶上爬,在树枝上爬,在夕阳下的草地上爬。。。");15     }16     @Override17     public void shootWeb() {                //实现吐丝方法18         System.out.println(name + " 吐丝织网抓虫子");19     }20     @Override21     public void sing() {                    //实现唱歌方法22         System.out.println(name + " 往事不要再提~人生已多风雨~~");23     }24     @Override25     public void exam() {                    //实现考试方法26         System.out.println(name + " 上午考语文,下午考数学,明天考英语。。。");27     }28 }29 public class Test {            //测试一下30     public static void main(String[] args) {31         SpiderMan spiderman = new SpiderMan();32         spiderman.creep();33         spiderman.sing();34     }35 }

运行结果如下:

接着来,有天傍晚蜘蛛侠吃饱了没事儿闲溜达,在路边草丛里发现了雷神的大铁锤,于是他有具备了闪电的能力:

1 public interface ILightningable {        //定义闪电能力接口 2     public abstract void lightning();    //闪电抽象方法 3 } 4 public class SpiderMan extends Person implements ISpiderable,ILightningable{//继承人,实现蜘蛛的行为能力接口,实现闪电能力接口 5     String name = "彼得·帕克"; 6  7     @Override 8     public void creep() {                    //实现爬行方法 9         System.out.println(name + " 在屋顶上爬,在树枝上爬,在夕阳下的草地上爬。。。");10     }11     @Override12     public void shootWeb() {                //实现吐丝方法13         System.out.println(name + " 吐丝织网抓虫子");14     }15     @Override16     public void sing() {                    //实现唱歌方法17         System.out.println(name + " 往事不要再提~人生已多风雨~~");18     }19     @Override20     public void exam() {                    //实现考试方法21         System.out.println(name + " 上午考语文,下午考数学,明天考英语。。。");22     }23     @Override24     public void lightning() {25         System.out.println(name + " 来一波闪电~");    //实现闪电方法26     }27 }28 public class Test {            //测试一下29     public static void main(String[] args) {30         SpiderMan spiderman = new SpiderMan();31         spiderman.creep();32         spiderman.sing();33         spiderman.lightning();34     }35 }

运行结果如下:

通过上面的例子,“接口表示一种能力”已经算是不言而喻了,那么,为什么说“接口表示一种约定”?

首先,什么是“约定”?所谓的约定就是,这事儿就按咱哥俩说的规矩办,谁也别出幺蛾子。举个经典的打印机的例子:要求实现打印机的打印功能。打印机的墨盒可能是彩色的,也可能是黑白的,所用的纸张可以有多种类型,如A4、B5等,要命的是墨盒和纸张都不是打印机厂商生产的。那么,打印机厂商如何避免自的打印机与市场上的墨盒、纸张不符呢?

分析:有效解决该问题的途径是制定墨盒、纸张的约定或标准,然后打印机厂商按照约定对墨盒、纸张提供支持,这样一来,无论最后使用的是厂商张三还是厂商王麻子提供的墨盒或纸张,只有符合统一的约定,打印机都可以打印。当然,“接口(Interface)”就是这样一种约定。打印机打印功能实现如下:

java接口是干啥_浅谈Java接口相关推荐

  1. java方法区对象类型_浅谈Java内存区域与对象创建过程

    一.java内存区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区域则 ...

  2. java的向下转型_浅谈Java向下转型的意义

    一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向 ...

  3. java中单例的应用_浅谈Java中单例模式的几种应用

    目录 浅谈Java中单例模式的几种应用 第一种:懒汉式 第二种:饿汉式 第三种:双重检索式 第四种:注册登记式 第五种:内部类形式 浅谈Java中单例模式的几种应用 日常开发中,为了提高我们系统中对象 ...

  4. php和java的区别菜鸟教程_浅谈Java和PHP的主要区别

    当谈到PHP与Java的差异性问题时,更多的是回答初学者的一些疑问.对于刚接触IT的同学来说,他们需要做好对未来职业的选择.所以是选择PHP还是选择Java更有利于自身的技术特点和发展前景.所以在解决 ...

  5. java类的命名规范_浅谈Java中的命名规范

    现代软件架构的复杂性需要协同开发完成,如何高效地协同呢? 答案是:制定一整套统一的规范. 无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没 ...

  6. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置

    在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分:该部分内容可以结合:JVM简介(更加详细深入的介绍) 1.栈区:由编 ...

  7. java四种内部类区别_浅谈Java中的四种内部类

    如果你看过一些JDK和框架源码的话,就经常会发现一般在类的定义中,都会再定义一些其他的类,这些类也同样会被编译成字节码文件,这样的类就被叫做 内部类 ,按照一般的分法,大致可以分为以下四类: 成员内部 ...

  8. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...

  9. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

最新文章

  1. centos 7 ssh 安装mysql,Centos 7 安装Airflow
  2. CSS Guide Lines
  3. 人民大学云计算编程的网上评估平台--解题报告 1001-1003
  4. 转-D3D中的四元数
  5. 如何在工作中快速成长?致工程师的 10 个简单技巧
  6. AndroidStudio中安装GsonFormat插件并根据json文件生成JavaBean
  7. 创建工程并测试RedisTemplate
  8. 机器学习python——python基础
  9. Google 's Gmail
  10. vue 实现 router store 文件自动加载
  11. 应用添加分享至微信、QQ和微博
  12. 计算机软件工程专业选科要求,选考科目科普:软件工程专业要求哪些选考科目?...
  13. 硬件系统工程师需要具备哪些技能
  14. 蒙特卡洛模拟最牛的地方在哪里呢?
  15. 一次LoadLibrary调用失败的调试经历
  16. PHP算法-快速排序
  17. 揭秘微信对方正在输入……到底表示什么意思?
  18. 玩转Python量化金融工具之NumPy
  19. Web服务器群集——部署AWStats基于Apache的日志管理
  20. C# 将PPT的每一页保存为图片

热门文章

  1. 5000字mysql整理
  2. python课后实训答案_python课后练习题
  3. python——判断一段音频是否有声音
  4. 校园视频AI分析预警系统 TesnorFlow
  5. Linux zip分卷压缩解压
  6. 解决数据重复插入问题(sql与锁方法)
  7. Linux运维一定要看的互联网行业薪酬分析!!!
  8. 横滨中文离线地图App上线
  9. Android | 自定义摇杆控件
  10. 使用axis2,根据WSDL生成java客户端代码