接口--interface
“interface”(接口)关键字使抽象的概念更深入了一层。我们可将其想象为一个“纯”抽象类。它允许创
建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数
据类型的数据成员,但它们都默认为static 和final。接口只提供一种形式,并不提供实施的细节。
接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。因此,采用了一个特定接
口的所有代码都知道对于那个接口可能会调用什么方法。这便是接口的全部含义。所以我们常把接口用于建
立类和类之间的一个“协议”。有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键
字,它做的便是与接口相同的事情。
为创建一个接口,请使用interface 关键字,而不要用class。与类相似,我们可在interface 关键字的前
面增加一个public 关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状
态。
为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字。我们要表达的意
思是“接口看起来就象那个样子,这儿是它具体的工作细节”。除这些之外,我们其他的工作都与继承极为
相似。下面是乐器例子的示意图:
具体实现了一个接口以后,就获得了一个普通的类,可用标准方式对其进行扩展。
可决定将一个接口中的方法声明明确定义为“public”。但即便不明确定义,它们也会默认为public。所以
在实现一个接口的时候,来自接口的方法必须定义成public。否则的话,它们会默认为“友好的”,而且会
限制我们在继承过程中对一个方法的访问——Java 编译器不允许我们那样做。
在Instrument 例子的修改版本中,大家可明确地看出这一点。注意接口中的每个方法都严格地是一个声明,
它是编译器唯一允许的。除此以外,Instrument5 中没有一个方法被声明为public,但它们都会自动获得
public 属性。如下所示:
- //: Music5.java
- // Interfaces
- 173
- import java.util.*;
- interface Instrument5 {
- // Compile-time constant:
- int i = 5; // static & final
- // Cannot have method definitions:
- void play(); // Automatically public
- String what();
- void adjust();
- }
- class Wind5 implements Instrument5 {
- public void play() {
- System.out.println("Wind5.play()");
- }
- public String what() { return "Wind5"; }
- public void adjust() {}
- }
- class Percussion5 implements Instrument5 {
- public void play() {
- System.out.println("Percussion5.play()");
- }
- public String what() { return "Percussion5"; }
- public void adjust() {}
- }
- class Stringed5 implements Instrument5 {
- public void play() {
- System.out.println("Stringed5.play()");
- }
- public String what() { return "Stringed5"; }
- public void adjust() {}
- }
- class Brass5 extends Wind5 {
- public void play() {
- System.out.println("Brass5.play()");
- }
- public void adjust() {
- System.out.println("Brass5.adjust()");
- }
- }
- class Woodwind5 extends Wind5 {
- public void play() {
- System.out.println("Woodwind5.play()");
- }
- public String what() { return "Woodwind5"; }
- }
- public class Music5 {
- 174
- // Doesn't care about type, so new types
- // added to the system still work right:
- static void tune(Instrument5 i) {
- // ...
- i.play();
- }
- static void tuneAll(Instrument5[] e) {
- for(int i = 0; i < e.length; i++)
- tune(e[i]);
- }
- public static void main(String[] args) {
- Instrument5[] orchestra = new Instrument5[5];
- int i = 0;
- // Upcasting during addition to the array:
- orchestra[i++] = new Wind5();
- orchestra[i++] = new Percussion5();
- orchestra[i++] = new Stringed5();
- orchestra[i++] = new Brass5();
- orchestra[i++] = new Woodwind5();
- tuneAll(orchestra);
- }
- } ///:~
- 代码剩余的部分按相同的方式工作。我们可以自由决定上溯造型到一个名为Instrument5 的“普通”类,一
- 个名为Instrument5 的“抽象”类,或者一个名为Instrument5 的“接口”。所有行为都是相同的。事实
- 上,我们在tune()方法中可以发现没有任何证据显示Instrument5 到底是个“普通”类、“抽象”类还是一
- 个“接口”。这是做是故意的:每种方法都使程序员能对对象的创建与使用进行不同的控制。
接口--interface的更多相关文章
- java中的接口interface
关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- 14 接口-interface的定义与实现
接口的基本语法一: 1.使用interface 定义 2.接口当中的方法都是抽象方法 3.接口当中的方法都是public权限 接口的定义: interface USB { public void re ...
- C#编程利器之三:接口(Interface)【转】
C#编程利器之三:接口(Interface) C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- java之接口interface
接口 1.多个无关的类可以实现同一个接口 2.一个类可以实现多个无关的接口 3.与继承关系类似,接口与实现类之间存在多态性 4.定义java类的语法格式 < modifier> class ...
- 【Java 基础篇】【第六课】接口interface
Java提供的这个interface的语法,目的就是将接口从类中剥离出来,构成独立的主体. 首先加入我们定义了这个杯子接口: interface Cup { void addWater(int w); ...
- TypeScript学习指南第二章--接口(Interface)
接口(Interface) TypeScript的核心机制之一在于它的类型检查系统(type-checker)只关注一个变量的"模型(shape)" 稍后我们去了解这个所谓的形状是 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Java接口interface
Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...
随机推荐
- Java初始化过程
这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...
- 【组织级项目管理】P2 MSP P3O
组织级项目管理--有你,有我,有大家 在过去的2年,无论对于企业来讲,还是对于我们个人都有很多大脑的冲击,有几个词大家应该特别耳熟能详:转型,变革,敏捷,互联网+,组织的项目化管理等.就是这些让我们的 ...
- mysql学习之 sql语句的技巧及优化
一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)
前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...
- Android 剪贴板详解
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...
- ASP.NET Core 缓存技术 及 Nginx 缓存配置
前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...
- 使用PushSharp给iOS应用推送消息
PushSharp是一个C#编写的服务端类库,用于推送消息到各种客户端,支持iOS(iPhone/iPad).Android.Windows Phone.Windows 8.Amazo.Blackbe ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- iOS 4s-6Plus屏幕自动适配及颜色转换为十六进制
iOS各种屏幕自动适配及颜色转换为十六进制 ★★★XLJMatchScreen自动适配屏幕★★★ 支持pod导入 pod 'XLJScreenMatching', '~> 1.0.3' 如果发现 ...