你可以把变量定义成使用接口的对象引用而不是类的类型。任何实现了所声明接口的类的实例都可以被这样的一个变量引用。当你通过这些引用调用方法时,在实际引用接口的实例的基础上,方法被正确调用。这是接口的最显著特性之一。

被执行的方法在运行时动态操作,允许在调用方法代码后创建类。调用代码在完全不知“调用者”的情况下可以通过接口来调度。

警告:因为Java中在运行时动态查询方法与通常的方法调用相比会有一个非常庞大的花费,所以在对性能要求高的代码中不应该随意的使用接口。

下面的例子通过接口引用变量调用callback( )方法:

class TestIface { public static void main(String args[]) { Callback c = new Client(); c.callback(42); }
}

该程序的输出如下:

callback called with 42

注意变量c被定义成接口类型Callback,而且被一个Client实例赋值。尽管c可以用来访问Callback()方法,它不能访问Client类中的任何其他成员。一个接口引用变量仅仅知道被它的接口定义声明的方法。因此,c不能用来访问nonIfaceMeth( ),因为它是被Client定义的,而不是由Callback定义。

前面的例子机械的显示了一个接口引用变量怎样访问一个实现对象,它没有说明这样的引用的多态功能。为演示这个用途,首先创建Callback的第二个实现,如下:

// Another implementation of Callback.
class AnotherClient implements Callback { // Implement Callback's interface public void callback(int p) { System.out.println("Another version of callback"); System.out.println("p squared is " + (p*p)); }
}

现在,试试下面的类:

class TestIface2 { public static void main(String args[]) { Callback c = new Client(); AnotherClient ob = new AnotherClient(); c.callback(42); c = ob; // c now refers to AnotherClient object c.callback(42); }
}

程序输出如下:

callback called with 42
Another version of callback
p squared is 1764

如你所见,被调用的callback( )的形式由在运行时c引用的对象类型决定。这是一个非常简单的例子,下面你将会看到另一个例子,它更实用。

局部实现

如果一个类包含一个接口但是不完全实现接口定义的方法,那么该类必须定义成abstract型。例如:

abstract class Incomplete implements Callback { int a, b; void show() { System.out.println(a + " " + b); } // ...
}

这里,类Incomplete没有实现callback( )方法,必须定义成抽象类。任何继承Incomplete的类都必须实现callback( )方法或者它自己定义成abstract类。

开课吧Java课堂:如何通过接口引用实现接口?相关推荐

  1. 开课吧Java课堂之SortedSet接口如何去用?

    集合接口定义了一个集合.它扩展了Collection并说明了不允许复制元素的类集的特性.因此,如果试图将复制元素加到集合中时,add( )方法将返回false.它本身并没有定义任何附加的方法. Sor ...

  2. 开课吧Java课堂:什么是ArrayList类

    ArrayList类扩展AbstractList并执行List接口.ArrayList支持可随需要而增长的动态数组.在Java中,标准数组是定长的.在数组创建之后,它们不能被加长或缩短,这也就意味着你 ...

  3. 开课吧Java面试题:虚引用与软引用和弱引用的区别

    简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处)? 无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存 ...

  4. 开课吧Java课堂之如何使用FilenameFilter

    你总是希望能够限制由list( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件.为达到这样的目的,必须使用list( )的第二种形式: String[ ] ...

  5. 开课吧Java课堂:是什么是比较函数?

    TreeSet和TreeMap都按排序顺序存储元素.然而,精确定义采用何种"排序顺序"的是比较函数. 通常在默认的情况下,这些类通过使用被Java称之为"自然顺序&quo ...

  6. 开课吧Java课堂:是什么TreeMap类

    TreeMap类通过使用树实现Map接口.TreeMap提供了按排序顺序存储关键字/值对的有效手段,同时允许快速检索.应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序. 下面的Tree ...

  7. 开课吧Java课堂:什么是HashMap类

    HashMap类使用散列表实现Map接口.这允许一些基本操作如get( )和put( )的运行时间保持恒定,即便对大型集合,也是这样的. 下面的构造函数定义为: HashMap( ) HashMap( ...

  8. 开课吧Java课堂:如何使用迭代函数

    在通过迭代函数访问类集之前,必须得到一个迭代函数.每一个Collection类都提供一个iterator( )函数,该函数返回一个对类集头的迭代函数.通过使用这个迭代函数对象,可以访问类集中的每一个元 ...

  9. 开课吧Java课堂:特殊的字符串如何操作,字符串如何连接

    字符串的长度是指其所包含的字符的个数.调用如下的length( )方法可以得到这个值: int length( ) 下面的程序段输出"3",因为在字符串s中有三个字符. char ...

最新文章

  1. win7电脑蓝牙 耳机
  2. RabbitMQ之RPC实现
  3. [WP]关于WP7的后台的一些小事情
  4. [Matlab] 传入 dsolve 的方程组必须是行向量才能求解
  5. and型变量哲学家问题C语言,利用AND型信号量解决哲学家进餐问题,要windows下的C/C++的完整源代码程序。(五个哲学家五只筷子)...
  6. fortran基础知识1----循环
  7. Thunderbolt是什么
  8. 12. CSS 字体
  9. python加载动态库出错_浅析python 动态库m.so.1.0错误问题
  10. 计算机视觉论文-2021-07-28
  11. STC8H8K64U单片机学习-0-宏晶STC官网初探
  12. SECS/GEM协议开发系列(一)准备工作
  13. 软考——系统架构设计师工作日志
  14. 戴尔7040linux改装win7,戴尔OptiPlex 7040台式机win10怎么改win7
  15. html爱情意思,1一9爱情数字什么意思 1到9数字爱情含义
  16. 笔记本AutoCAD启动时闪退怎么办_AutoCAD启动时闪退怎么办?打开AutoCAD就死机怎么办?...
  17. 用python可以做什么有趣的事情_用python做一些有趣的事(一)——根据照片制作版画...
  18. 【和ChatGPT对话】帮助新手批量提取图片文字信息到文件
  19. .NET新手系列(九)
  20. 从GitHub上下载项目后如何运行,学习

热门文章

  1. [转载] [python3教程]第七章.输入输出(Input and Output)
  2. Spring MVC浅入浅出——不吹牛逼不装逼
  3. springboot-mybatis-多数据源
  4. 获取公网ip,获取用户城市地址
  5. Autolayout屏幕适配——代码实现(苹果公司 / VFL语言 / 第三方框架Masonry)
  6. python中的shallow copy 和 deep copy
  7. 简述AI技术的工程部署
  8. 【贪心School】机器学习课程笔记
  9. java foreach多线程_详解多线程入门案例与java8的并行流
  10. mysql表索引类型修改_MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结...