Java中的Interface

记录一下对 Java 中的 interface(接口)的理解,在看 Java 资料中讲解多态的理解的时候,常常看到

// 下面函数将在某处被调用
public void OperateClassA(A a) {         // A是一个将被重写方法的基类或抽象类或接口
	OPerate(a.method() );
}; 

这样的语句,而在 C++ 中讲多态的时候往往写为

A *a = new BDerivedFromA();            // A是一个基类而B是一个派生类
a->Operate();

其实两种写法并不是在各自语言特有的,而 C++ 也可以写为第一种写法(传入实例化的对象然后在内部调用),而 Java 也可以写为第二种写法(直接用基类调用其成员函数)。而当 A 是一个 interface 时,第一种写法往往更容易理解一些,这时你可以将 interface A 看成是一个插头(如三线插头),将实例 a 看成某一个确定的插头(如空调三线插头),那么你的 OperateClassA 就是一个三线插头的插座。

这里先要说明的是,本质上 Java 的 interface 非常类似于 C++ 中的成员函数都为虚函数都 =0 的抽象基类,C++ 中没有对抽象类做进一步的划分,而 Java 将其划分为了 abstract class 和 interface。另外 C++ 中基类的成员函数必须声明为 virtual 才可以实现动态绑定,而 Java 中所有的方法除了 final 声明的都默认为动态绑定。使用 C++ 而没有太多使用 Java 的人有可能会采用第二种写法(也有可能写后面的分离的做法,见下),而熟悉 Java 特别是 interface 的人可能会倾向于第一种写法,因为若将其中传入的对象改为一个接口对象(即如上一段所述,当 A 是一个 interface 时),例如

public void OperateClassA(InterfaceOfA a) {  // InterfaceOfA是一个将被A实现的接口
	OPerate(a.method() );
}; 

这样的写法更加体现出 Java 语言中尽量使得各模块分离的思想,而且可以看见这种写法(第一种写法,即传一个对象到一个函数中去)在 Java 中是很常见的。很多文章中都说过接口(interface)就是类似于插座的接口,从这种写法中我们可以感受到这种设计的思想,OperateClassA 的设计者只要了解了接口 A 的设计,就可以将所有对接口 A 的操作写在一个函数内,好像 A 就是一个插头类,而 a 是一种 A 类型的某个电器的确定的插头,a 中的每一个 method 都是一个公接头(可以想象成一个三/多孔插头的每一个齿),OperateClassA 就是一个插座(想象成一个三孔插座),OperateClassA 中每一个对 a 的操作就像是对插头中的某一个公接头提供电流(实际上是向 a 或从 a 获取信息)这种做法在认识上让程序员将 a 作为一个类似于物理意义上的“接口”对象,使得其抽象层次更高,更容易理解类之间信息传递关系。

当然,C++ 也有类似的封装方式,如

A *a = new BDerivedFromA();            // A是一个基类而B是一个派生类
void OperateClassA(A *a) {
	a->Operate();
};

这种写法也可以起到一定层次的抽象,但从认识上 Java 的 interface 的概念可能更容易被人理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值