黑马程序员技术交流社区

标题: 为什么要定义接口呢 [打印本页]

作者: 李泽巍    时间: 2012-9-20 21:42
标题: 为什么要定义接口呢
一直很不理解接口的作用,写一个类里面写上方法然后拿去实例化用就可以了,为什么还要定义接口然后实现它,这样究竟有什么好处呢?
而且接口看起来很像抽象类的抽象方法,接口里还不能定义成员变量,这让我更无法理解接口的意义了
作者: 皮卫凯    时间: 2012-9-20 21:59
首先 接口是什么呢 ,接口就是一种约束,它里面只包含了属性、方法的定义,而没有具体实现,这点类似一个抽象类,但是与抽象类不同的是它不能包含有已经实现的方法
里面的成员不用写修饰符,是因为所有里面的都是可以对外公开的内容,都是 public 的。
通过这个接口,调用者无须知道目标对象的具体详细信息,只需要知道它实现了这个接口,那么它便可以依据这个接口来使用这个对象了。
实现接口方法的同时,也拥有的接口中定义的成员变量。
与抽象类的最大区别是,接口可以多实现,而类只能单继承。
作者: 严海荣    时间: 2012-9-20 22:00
这是在CSDN上看到的,虽然有点黄有点暴力,但是看了你就记住了。

你都没有理解接口的含义。类是对象的抽象,接口抽得更厉害,是类的抽象。不打机锋,直接看尘世的七情六欲。

比如,你要一个充气娃娃,这个充气娃娃有一个makeLove方法,你买这个娃娃就是冲着makeLove去的,你不关心它是哪国的娃娃,长得怎样。那么代码就体现为:

interface Chongqiwawa{
public void makeLove(String name);
}

class Person{
Chongqiwawa wawa;
public void setWawa(Chongqiwawa wawa){
  this.wawa = wawa;
}
private String name;
public void makeLove(){
  //调用wawa的makeLove方法
  wawa.makeLove(name);
}
现在,你想和wawa那个,就可以这样用了:
main(){
  Person you = new Person();
  you.makeLove();
}

报错了吧?你怎么能跟虚的wawa那个呢?所以必须要买一个wawa.好吧,去逛成人店选购一个wawa.这里有日本娃娃,美国娃娃,先看看美国娃娃功能怎么样。

class USAWawa implements Chongqiwawa{
  public void makeLove(String name){
  System.output.println(name + " come on! a,a, a...");  
  }
}
好吧,你已经流口水了,一口价成交,然后带回家,迫不及待实践一下,代码体现为:
main(){
  Person you = new Person();
  Chongqiwawa wawa = new USAWawa();
  you.setWawa(wawa);
  you.makeLove();
}

这时候你已经可以和娃娃水乳交融了。不久,你发觉厌倦了美国娃娃,想试下日本娃娃,再次来到成人超市,日本娃娃makeLove功能实现如下:
class JapanWawa implements Chongqiwawa{
  public void makeLove(String name){
  System.output.println(name + " yemede! a,a, a...ganbade...");  
  }
}
OK,你直接丢下一堆钞票一句不用找就抱回家了,马上进入主题:

main(){
  Person you = new Person();
  //获得实际的wawa
  Chongqiwawa wawa = new JapanWawa();
  you.setWawa(wawa);
  you.makeLove();
}
看见了吗,只需改动一行代码,你就实现了娃娃的切换,得到不同的makeLove感受,其他代码都不用改。
这就是接口!
作者: 程金    时间: 2012-9-20 22:04
接口就是一套技术标准,声明了统一方法.每个人去实现接口的方法都不一样,但是用户只需要了解接口的方法,直接调用,不用关心他的方法是怎么实现的接口是绝对的抽象类,接口最大的最主要的作用就是解决java"单继承"局限,你只能继承一个普通类包括抽象类,但是你可以实现任意个数的接口.
当然对于接口的作用,在一些小的项目上,很难看出其发挥的优势,就像做很小的项目无法体会ssh的作用一样。其实,在一些大项目上,接口的作用是发挥地相当的明显的。
    比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。
    但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率,使用接口还有使用方便,可读性强,结构清晰等优点。
  
作者: 李健_8    时间: 2012-9-20 23:10
打个比方   就像你造车子  你就可以同时继承接口   轮胎  车盖   方向盘。。。 ,获得不同的特性。我开始也不懂很痛苦,后来做项目时,才体会出来。要有一定代码量才好理解
作者: 张小龙    时间: 2012-9-21 00:10
现在还不太明白,可能是因为你还没有接触面向接口编程。我们老师讲到spring的时候,就花了一些时间讲到了面向接口编程。

确实,面向接口编程是很有好处的,接口嘛,不能实例化,只能实例化实现它的子类,这个大家都知道。

但是,接口真正设计的目的,其实就是应是定义与实现的分离。因为系统中,各个功能是由很多不同的对象协作完成的,所以

各个对象内部如何实现并不重要,只要而各个对象之间的容易关联就可以了。

下面给点示例代码,你就明白了:

首先给出以下代码:
public interface Irun {     //假设定义一个跑步的接口Irun
        public void run();
}
class Run100 implements Irun{     //这个类是实现Irun的类,也就是具体类,这个是跑100米的
        public void run() {
                System.out.println("run 100 meters");
        }
}
class Run200 implements Irun{     //这个类是实现Irun的类,也就是具体类,这个是跑200米的
        public void run() {
                System.out.println("run 200 meters");
        }
}
class Person{                //这个类叫做业务类 这个类只能针对接口编程 不针对实际的类编程
        private Irun irun=null;
        public void setRun(Irun irun){
                this.irun=irun;
        }
        public void getRun(){
                irun.run();
        }
}
下面我再给你一个测试类,你就明白了:
public class Test{             //这个类主要用来测试  首先 如果某个人想跑步,假设有不同的方法,有100米 200米 ....
        public static void main(String[] args){        //这时,如果想跑一百米,就只需要传递一个实现了具体跑步的类的对象就行
                Person p=new Person();        //接口类不需要改,业务类也不需要改,只要你实现了跑步这个方法的类,都可以直接拿来就用了
                p.setRun(new Run100());      //假设 如果想跑100 就传run100  如果想跑200就传run200  非常易于扩展
                p.getRun();                       //而如没有用接口的话,那么你调用业务类,就还得去改动业务类才行
}
}


以上代码全是自己现写的,希望能对楼主有点儿帮助吧,毕竟现在阶段还完全用不到接口,
因为我们通过的那些基础测试,入学考试,还有面试问题根本不会问的这么深,所以了解到此应该够了
作者: 王小闲7    时间: 2012-9-21 00:38
我的认识是这样的,就是可以解耦,比如类A,B同时是想了接口c那么你在创建A和B的对象的时候可以这样写,c a = new A(); c b = new B();  
这样你在增加A或者B的功能的时候就可以在C接口里添加方法,就可以使A,B添加新功能,这样就不必改动太多的代码,这是我的理解,希望能够帮到你。
作者: 王宝龙    时间: 2012-9-21 00:52
为什么Java要引入接口的概念呢?因为Java不支持多继承。例如:

  1. [python] view plaincopy
  2. 01.class Person//定义一个Person类  
  3. 02.{  
  4. 03.    private String name;  
  5. 04.    private int age;  
  6. 05.    public Person(String name,int age)  
  7. 06.    {  
  8. 07.        this.name=name;  
  9. 08.        this.age=age;  
  10. 09.    }  
  11. 10.    public void SayHello()//定义一个方法  
  12. 11.    {  
  13. 12.        System.out.println("我是"+name+"我的年龄是"+age);//输出姓名和年龄  
  14. 13.    }  
  15. 14.}  
  16. 15.class Chinese extends Person//定义一个Chinese类继承Person类  
  17. 16.{  
  18. 17.    public Chinese(String name,int age)  
  19. 18.    {  
  20. 19.        super(name,age);  
  21. 20.    }  
  22. 21.    public void ShowChinese()  
  23. 22.    {  
  24. 23.        System.out.println("我是中国人");  
  25. 24.    }  
  26. 25.}  
复制代码
如果我们把Chinaese类再继承一个类这就是错的了。但是每个类可以像这样实现多个接口例如:class Chinaese extends Person implements Inter。

作者: AngieFans85    时间: 2012-9-21 01:04
接口的作用和好处就太多了,我就不一一列举出来了,前面的贴子已经回答的差不多了.
我建议,你才学到接口,还是先不用去管接口有什么好处了.学到后面,自然就通了,你现在去细究只会让自己越来越头疼.一步一步的慢慢来,这是水到渠成的事情.
作者: 黑马杨锦喜    时间: 2012-9-21 01:29
     Java是一种单继承的语言,一般情况下,那个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,只到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。
      再就是使用Java接口将软件单位与内部和外部耦合起来,达到解耦的目的。
      做过Java Web项目或者编写大量代码的人会更有深入的体会的!我之前是做Java Web开发的,了解点。
作者: 翁鹏    时间: 2012-9-21 10:57
本帖最后由 翁鹏 于 2012-9-21 11:16 编辑

首先说下接口与抽象类的区别: 在使用上,没有具体方法的抽象类与接口非常相似。
但有以下几点区别: 1.一个类可以实现任意多个接口,但它最多只能扩展一个抽象类。
                            2.一个抽象类可以含有若干个具体方法,而一个接口的所有方法都是抽象的。
                                    接口中的所有方法隐含public abstract        接口中所有字段隐含public static final  即字段都是常量
                           
3.抽象类可以声明和使用实例变量,而接口只能定义常量。
                                          4.抽象类可以定义构造函数,接口不行。


    在面向过程开发中,我们考虑的是如何实现,依赖的是每个具体的实现(即每个具体的函数,像C语言一样)。
    而面向对象开发中,我们需要依赖的是抽象(接口与抽象类),而不能依赖具体的实现。可以说是面向接口编程。这样的依赖关系可以实现代码间的低耦合
    接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化,各司其职才能保证抽象的依赖完美实现。

            总的来说,接口是软件工程中一种很重要的思想。
作者: 霍永刚    时间: 2012-9-21 11:13
接口相当于一种约束,它里面只包含了属性、方法的定义,而没有具体实现,这点类似一个抽象类,但是与抽象类不同的时它不能包含有已经实现的方法。比如:
public interface IInterfaceExample
{
int Property1 {get;set;}
string Test();
}
里面的成员不用写修饰符,是因为所有里面的都是可以对外公开的内容,都是 public 的。
它的本意是为多个不同的对象规定一个通用的规范,最常见的莫过于用来实现多态了。
通过这个接口,调用者无须知道目标对象的具体详细信息,只需要知道它实现了这个接口,那么它便可以依据这个接口来使用这个对象了。
作者: 柳彬    时间: 2012-9-23 21:16
接口的引进为了实现多继承,同时免除了c++的多继承的复杂性
作者: 陈琦    时间: 2012-9-23 21:25
1.接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。(编程思想)
2.接口提供了一种标准。可以扩展标准,比如web容器由tomcat实现。
3.可以解决多继承的问题。

作者: 张忠豹    时间: 2012-9-24 21:07
个人学习Java时的一点总结,希望对楼主有用:
接口:
1,是用关键字interface定义的。
2,接口中包含的成员,最常见的全局常量,抽象方法。
        注意:接口中的成员都有固定的修饰符。
        成员变量:public static final
        成员方法:public abstract

interface Inter
{
        public static final int x = 3;
        public abstract void show();
}
3,接口中有抽象方法,说明接口不可以实例化。
        接口的子类必须实现了接口所有的抽象方法后,该子类才可以实例化。
        否则,该子类还是一个抽象类。
4,类与类之间存在着继承关系,类于接口中间存在的是实现关系。
        继承用extends  实现用implements

5,接口和类不一样的地方,就是,接口可以被多实现,这就是多继承改良后的结果。
        java将多继承机制通过多现实来体现。

6,一个类在继承另一个类的同时,还可以实现多个接口。
        所以接口的出现避免了单继承的局限性。还可以类进行功能的扩展。

7,其实java中是有多继承的。接口于接口之间存在着继承关系,并接口可以多继承接口。


接口和抽象类的区别:
抽象类一般用于描述一个体系单元。将一组共性内容进行抽取。特点:可以在类中定义抽象内容让子类实现,
可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。

接口:一般用于定义对象的扩展功能,是在继承意外还需这个对象具备的一些功能。

抽象类和接口的共性:
        都是不断向上抽取的结果。
抽象类和接口的区别:
1,
抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。

2,
抽象类中的可以定义非抽象方法,子类可以直接继承使用。
接口中都有抽象方法,需要子类去实现。

3,
抽象类使用的是  is a 关系。
接口使用的 like a 关系。

4,
抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。 全都是public的。

在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。至于A是如何对规则具体实现的,
B是不需要知道的。这样这个接口的出现就降低了A和B直接耦合性。

大家在理解接口时,不要狭义的将接口理解为interface 。
广义的理解接口: 应该对外提供的公共的访问方式。
作者: 黄佳    时间: 2012-9-24 23:10
  接口是为了实现java的多继承的,  是一种的特殊的抽象类,当有类继承他时,  这个类必须重写接口里面的所有方法,  因为接口里面的方法都是 抽象方法,  抽象方法被继承是 必须被重写的 ,  
作者: 黄佳    时间: 2012-9-24 23:18
  我个人对 接口 的理解是类比于  现实生活中的"抽象概念" 这几个字的 ,   概念是从具有相同的 属性的事物 的一种抽象  ,  接口也是的  他就是一个抽象的东西,  就像"爱情",  这是一个概念 ,   概念是不能被实例化的  ,   就像  丘比特 他是爱情信使,  他就继承了 "爱情" ,  当他的箭 射向谁的时候 ,   谁才拥有了爱情这个东西  ,这个时候爱情 就被实例化了, 而且每个人的  爱情的体现形式 是不一样的,   这就好比接口 只有被继承 后才能被 实例化一样.   

  个人对接口 浅薄的理解就是 这样的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2