一直对java中接口的作用不是太明了。虽说一个类可以implements多个接口,但接口本身只是定义了几个方法,没有任何实际的意义,具体的实现还是要在实现它的类中进行。这样的话,接口还有什么意义呢?
举个例子来说,现有
public interface I
{
    method1(){};
}
class A implements I
{
    method1()
    {
         somefunction......
    }
}这样写和不实现接口,直接将method1作为class A的方法有什么区别呢?
即:
class A
{
    method1()
    {
        somefunction......
    }
}能不能具体举个例子来说明它们在使用上的区别呢?

解决方案 »

  1.   

    通过运用关键字interface,Java允许你充分抽象它实现的接口。用接口,你可以定义一系列的被一个类或多个类执行的方法。接口自己不定义任何实现。尽管它们与抽象类相似,接口有一个特殊的功能:类可以实现多个接口。与之相反,类只能继承一个超类(抽象类或其他)。接口的意義在於oo的思想 在於抽象
      

  2.   

    接口是把不变的和变化的分离,接口只是定义那些不变化的,如使用哪些方法、有哪些参数、有哪些返回。而实现它的类则去负责实现具体的事情。例子:老大说,你给我买一台电脑,要能上网、QQ就行。于是你去电脑城卖了一台笔记本,而路人甲则买了一台台式机。但是它们都能实现上网和QQ。 老大说的是接口,你和路人甲则是实现(implement)兄弟如果要reuse一些类,最好的方法是组合,即在你要用到某个类的类里声明包含某个类的实例,这样也不用写代码。而非是继承!最后建议你把OO和生活中的事联系起来,什么都来源于生活,程序设计也不例外。最朴素的才是最好的。
      

  3.   

    我很清楚楼主现在的想法,楼主指的是接口中的方法是虚的,根本没用,为什么不在子类直接定义。但楼主你想到没有,有一些继承机制在子类当时建立时未必是会考虑到的,如果一切全部写在一个类中,那么用这个子类代替one Class难道不是小题大作吗?如果真的这样,object中就没有extends and 多态了。概之,引用接口目的就是实现C++中的多继承机制,并且抽象出一组抽象的功能,供子类引用。
      

  4.   

    呵呵,举个例子..
    如果没有JDBC接口
    每个数据库厂商实现一个自己的数据库操作类库
    你写个数据库的程序,万一有一天要用别的数据库了..你的所有程序都报废了 !! 但有了JDBC,你就可以用任意一个数据库,而仅仅需要替换一下对应的驱动就OK了 !!!
      

  5.   

    好问题,楼主不提出来我也没想到这么多!借楼主宝地,提个问题:
    比如我们在多线程编程中经常用的Runnable接口,它有一个run()方法,一般是implements Runnable,
    然后重写run()方法。但是,如果我不implements Runnable,而直接在我的类中定义run()方法(这时,方法名字都可以不一样),然后再声明这个类的一个实例,把这个实例用作Thread类的线程体,我想,在编译的时候肯定编译不过。但是大家想一想,除了没有implements Runnable以外,其他的还有哪点不一样呢?可是就是编译通不过!
    所以,我想,接口的作用不仅仅是提供一个没有任何实现的空方法,但我又不知道该怎么解释。
    楼上几位兄弟的回答好象有点含糊,或者不客气的说是没有答到点子上,楼主的意思是说为什么不把接口中的空方法直接拿到类中来实现,说“更具层次”恐怕还恰当些;如果是因为实现C++中的多重继承的话,这种继承有什么意思呢?我们继承父类的目的是使用它的方法,它的成员变量,但如果解释为多重继承的话好象没有达到我们的要求吧,我看了你们的回答后还是没领悟透彻。
    俺的领悟力差,一家之言,纯是为了讨论,没有人身攻击的意思,请大家不要见怪!
      

  6.   

    To cq_pro(重庆制造):
    其实“zez(思恩 闭关练功ing...)”的回答给了我不少的启发,我想我有点了解了。接口的作用是抽象对象的一部分功能进行统一的操作。所有实现某接口的类就有这个接口的所有特性。也就是说:
    class A implements I{...} 
    class B implements I{...}
    A a = new A();
    B b = new B();
    然后对象a和b都可以在所有需要参数I的地方使用了。比如另有一个函数function f(I),它需要传一个接口I的参数,那么你可以使用f(a)和f(b)来实现函数的功能。而如果你的类A和B不实现I接口的话,使用f(a)和f(b)就会编译不通过。举一个与runnable接口相类似的listener接口。
    class myClass implements ActionListener
    {
        button1.addActionListener(this); //这里的this指的是myclass,如果不实现ActionListener接口,即使在类中定义ActionPerformed()方法,也无法传递this参数    public ActionPerformed()
       {
        ......
        }
    }
    /*这句话相信用过java控件的人都非常熟悉吧,它的原型如下:
    class Button
    {
        ...
        addActionListener(Listener)  //其中Listener是一个接口,只有实现Listener接口的类才能传进去
        {
             .......
        }
    }
    */