偶菜菜,学习面向对象也有快两个月了,然而对接口这个东西还是很是疑惑,尤其这几天研究ARCEngine,面对铺天盖地的“I××”都崩溃了,各位大大们救救我吧。小弟的疑问主要有如下两个方面第一个,以前听过一个java班的老师讲,接口是大家的通信协议,项目A的第一小组和第二小组通过接口把程序结合起来,项目就 搞定了。不明白的是大家都继承自这个接口,但是各自实现各自的方法,这样不是前言不搭后语吗,程序怎么能结合到一起呢?第二个,ARCEngine不知道有没有这个的朋友,是一个地信二次开发方面的kit,它给出了,大量的接口,每次用接口的时候都是"IAA a = new bbclass();"。不明白为什么要这么设计,直接给出类来,我就new各种对象不是更方便吗?而且,我总觉得这两个问题中的接口好像不是一个概念似的头大了,头大了!各位达人s,帮帮小弟的吧;
比如你要用java操作数据库 那么你会怎么办?
你肯定想有个类来调用对不对??
可是这个类 我和你说 这个不是sun公司写 而是由数据库厂商来写的
那么你一个类我一个类 类名参数 返回值可能都不同 那你怎么方便记忆和使用阿?
于是sun只提出接口 规定了方法 这样你只需要调用接口就可以了 而不去关系数据库厂商怎么实现的了
不知道这个能否理解
你的代码
interface A{
public void doSomething();
}
class B{
public void go(A a){
a.doSomething();
}
}
别人的代码(后写的)
class C implemengts A{
public void doSomething(){
System.out.println("ok");
}
}
如果想要你的代码能够调用C的函数,最简单的方式就是new B().go(new C()),更常用的是反射机制
A是基类(不是抽象类也不是接口),B、C、D都继承A,
A中定义好方法,B、C、D分别覆盖实现这些方法。
然后 A = new B(); A = new C(); A = new D(); 搞定之。
此时有人问了,那还要接口干嘛?
接口的关键在于如果你继承了A(此时A变成接口),编译器就强制你必须实现接口中的方法,注意!是在编译期间就必须实现。接口把应该实现的方法用定义的方式体现,但本身并不实现它(因为你不知道具体运行环境是什么情况,也无法实现)这相当于制定了规范,实现类要实现它,就必须要全部重写里面的方法,以保证有人用接口操作时不会出问题。想想看,如果A仅仅是一个常规类,子类是可以不用实现所有方法的,而基类的方法实现很难保证运行期的正确性。所以这个“接口”就失去了规范性。不知道这样说明白了没有。其实,接口最重要的特性并不在此,因为抽象类完全可以替代接口,因为抽象类里如果不定义实现方法而全是抽象方法,其实就是接口。接口本身就是一个特殊的抽象类。sun当初设计接口,真正的目的是为了实现多继承,但是又不想象C++那样用常规类来实现多继承,因为他们觉得那样会使程序变得很复杂,不利于解耦。
所以我个人的理解接口最终极的目标就是为了最大限度的、彻彻底底的解耦。
===============================
第一个,以前听过一个java班的老师讲,接口是大家的通信协议,项目A的第一小组和第二小组通过接口把程序结合起来,项目就 搞定了。不明白的是大家都继承自这个接口,但是各自实现各自的方法,这样不是前言不搭后语吗,程序怎么能结合到一起呢?-------------------------------比如国家规定了:平均电压是220V,频率是50Hz的正弦交流电,是我国家用电的标准。这是国家制订的规范,你可以认为它是接口发电厂有很多:风力、水力、火力、核电,但它们生产的电要想被家用电器所接受,就必须达到国家制订的这个标准。也就是说,电厂实现了接口。你、我、他、张三、李四...... 等等家里使用的电器,包括冰箱、洗衣机、电视机......,它们使用的都是国家规定的那种电源。也就是说,它们是接口的使用者
在这个模型中,家用电器看到的是达到规范的电源,也就是说它们面向的是接口,它不必关心实现接口是哪种类型。
电厂也只管生产规范的电力,也就是说它们只管实现接口的功能,也只管提供接口中规定的规范,而不必关心到底是谁会使用这个接口。这样一来,模块与模块之间的联系就没有那么紧密了,也就是我们说的降低了模块之间的耦合性。也即增强了灵活性。另外,如果你学过了 AWT 以及它们的事件处理方式,可以仔细地去思考一下AWT中的事件处理为什么要用接口。