今天偶然发现竟然还有叫abstract interface的,以前只知道interface,各位能否给讲讲他们两者之间有什么区别,欢迎大家一起来探讨!!!

解决方案 »

  1.   

    觉得用不用abstract来修饰interface没多大必要,现在interface已经很好的体现了abstract和接口的作用,用abstract来修饰class产生抽象类还有意义,但是这样用觉得没多大用!
      

  2.   

    interface他的本质上就是一个抽象的类的要求。但是他不指明具体的实现方式。所以说,他也就是abstract。所以我认为,那种说法其实就是废话了。呵呵:)
      

  3.   

    说实话我是头一次听说abstract interface
    刚才在网上搜了一下,还真没有这个说法  :)如果楼主对interface和abstract class比较有兴趣可以看这个精华帖
    讨论地比较深入
    http://community.csdn.net/Expert/topic/3451/3451842.xml?temp=.7041742
      

  4.   

    用abstract interface 来定义一个接口编译没有错误,说明编译器是支持这种写法的,现在就是怀疑是不是两者之间有没有什么区别??
      

  5.   

    刚才测试了一下!确实编译没有问题interface本来就不允许定义方法体,那么这已经是很abstract了,现在使用这个关键字来修饰完全也就是没有必要的了!
    我认为没有什么意义
      

  6.   

    interface内部本来就没有函数体的,因此也就属于abstract!可以这么去理解:abstract就类似于interface的”超类“,即符合interface的肯定也符合abstract
      

  7.   

    我猜测认为abstract interface 应该是一个函数定义都没有的 interface, 但是测试结果是,两者都可以不定义任何函数。
      

  8.   

    虽然interface没有方法体,但是如果你的interface中有abstract接口,那么就必须定义这个interface为abstract了,其实,它的意义巨大,给个例子给吧:
    abstract public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }abstract public class CBase implements IA {
       protected String[] s ;   public CBase() {}    public void run() {
         setParams();
         if (s != null && s.length() > 0) {
            for (int i=0; i<s.length() ; i++ ) {
               System.out.println("s[" + i + "]:" + s[i]));
            }
         }      }   abstract public void setParams() ;
    }public class CSub entexted CBase {  public CSub() {}  public void setParams() {
         this.s = {"abcd", "efg"} ;
      }   public static void main(String[] args) {
         IA csub = new CSub() ;
         IA.run() ;
      }
    }输出结果:
      s[0]:abcd
      s[1]:efg
      

  9.   

    to  zmt_cn(细雨微凉) :强!!!,能不能从设计角度谈谈这方面的认识。
      

  10.   

    to zmt_cn(细雨微凉)
    看不出有什么特殊意义,你的那个例子把
    public abstract interface IA {
        public void run() ;
        abstract public void setParams() ;
    }
    改成
    public interface IA {
        public void run() ;
        public void setParams() ;
    }
    其他都不动一样没问题啊
      

  11.   

    我觉得这个abstract和接口里方法前面的那个public差不多,有也可以,没有也死不了人
      

  12.   

    to  zmt_cn(细雨微凉) :我把第一行代码的 abstract 去掉了发现也可以正常运行,是不是说明写不写 abstract 都是一个意思?abstract public  interface IA {   ---〉 public  interface IA {
      

  13.   

    对不起,写得太快,是没有反应出abstract的具体意义,重新整理如下:abstract public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }abstract public class CBase implements IA {
       public CBase() {}    abstract public String[] getParams() { }   public void run() {
         String[] s = getParams();
         if (s != null && s.length() > 0) {
            for (int i=0; i<s.length() ; i++ ) {
               System.out.println("s[" + i + "]:" + s[i]));
            }
         }      }
    }public class CSub entexted CBase {  public CSub() {}  protected String[] s ;  public String[] getParams() {
        return this.s ;
      }
    }public class DSubSub extends CSub {
      public DSubSub() {}  public void setParams() {
         this.s = {"abcd", "efg"} ;
      }   public static void main(String[] args) {
         IA dsubsub = new DSubSub() ;
         dsubsub.run() ;
      }}输出结果:
      s[0]:abcd
      s[1]:efg从设计意义上来说,我举个例子:
        CBase 类是所有电器产品总类,其中的run()函数负责输出某种电器产品的库存总价值。
        CSub 类是所有小家电产品类,其中getParams()函数负责得到某种小家电产品库存总价值。
        DSubSub类是小家电中的电吹风机类,其中的setParams()函数负责电吹风机的特有计算库存产品价值的方式。
        当你的每一类电器产品都有自己不同的价值计算方式时,使用这种构架就可以很好的分类计算。
        而这些业务逻辑实现类在三层构架中是不提供给客户端调用的,提供给客户端的仅仅是Interface,那么这种设计就是相当必要的。
      

  14.   

    补充: 
       CSub 类也必须定义为abstract,
       即:  abstract public CSub extends CBase() {}
      

  15.   

    再补充说明:
        在Interface中被定义的 abstract 方法 setParams() 是不允许被客户端调用的,但它却必须被分级到诸如电吹风类的类实现,并且也只能在电吹风类中实现,因为需求是——大多数的精确到电吹风类的业务逻辑都有所不同,这时,你们说 interface 中的 abstract 是不是意义重大呢?
      

  16.   

    楼上说的还是没有什么区别吧。abstract public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }如果换成public  interface IA {
        public void run() ;
        public void setParams() ;
    }实现的效果也是一样的吧。interface 本身就是abstract的,只不过没有明确的规定出来,说一定要把abstract这个关键字写上。
    所以abstract interface 就是interface,两者根本没有区别。在java in a nutshell里,“
    All methods of an interface are implicitly abstract, even if the abstract modifier is omitted. ”在thinking in java里,
    “ the abstract keyword, which allows you to create one or more methods in a class that have no definitions—you provide part of the interface without providing a corresponding implementation, which is created by inheritors. The interface keyword produces a completely abstract class, one that provides no implementation at all.”
    所以结论就是 abstract interface 就是interface,两者根本没有区别。
      

  17.   

    to zmt_cn(细雨微凉) :非常感谢你的指导,上面的程序在我的机器里(java version "1.4.2_06-b03")编译不通过,我进行了修改,最主要的修改是:public class CSub extends CBase { ---〉abstract public class CSub extends CBase { 程序如下:abstract public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }
    abstract public class CBase implements IA {
       public CBase() {}    abstract public String[] getParams();   public void run() {
         String[] s = getParams();
         if (s != null && s.length > 0) {
            for (int i=0; i<s.length ; i++ ) {
               System.out.println("s[" + i + "]:" + s[i]);
            }
         }      }
    }
    abstract public class CSub extends CBase {  public CSub() {}  protected String[] s ;  public String[] getParams() {
        return this.s ;
      }
    }
    public class DSubSub extends CSub {
      public DSubSub() {}  public void setParams() {
         this.s = new String[] {"abcd", "efg"} ;
      }   public static void main(String[] args) {
         IA dsubsub = new DSubSub() ;
         dsubsub.run() ;
      }
    }
      

  18.   

    to zmt_cn(细雨微凉) :你的程序看了之后,我发现有没有abstract是一样的,呵呵
    难道是我们都不能看出其中的精华?费解
      

  19.   

    Interface:接口
    Abstract Class:抽象类
    Class:类,包括抽象类。
    学 Java 的人,或学 OO 编程的人,都是要弄清楚这两个概念的区别。
    现将我的观点说一下。
    在OO中,Interface 和Abstract Class 是两个不同的概念。1。Abstract Class类似于 Abstract Data Type(抽象数据类型),它定义了它所有的subclass(子类)应该有的特性,就是在Abstract Class 中声明方法和变量。如定义一种抽象类型:车。那么在Java中,就要在class或method上加上 abstract。举个例:public abstract class 车
    {
      public int 轮子;
      public abstract void 移动();
    }
    这个抽象类就声明了所有的车应有的特征(如轮子)和行为(如移动)。之后你就可以扩展(extend)这个抽象类,只要是车,就可以,还有你可以在子类(subclass)中加入自己的特征,如
     public class 跑车 extends 车
     {
      public void 移动() 
      {
        System.out.println("我在移动");
      }   
      public void 引擎类型()  //属于自己(跑车)的行为
      {
        System.out.println("高级引擎");
      }
      轮子=4;
     } public class 自行车 extends 车
     {
      public void 移动() 
      {
        System.out.println("我在移动");
      }   
      public void 爆胎()  //属于自己(自行车)的行为
      {
        System.out.println("我走不动了");
      }
      轮子=2;
     }2。Interface 则用来定义一个协议,所有的方法都可以实现它。一个Interface定义了方法,和最终静态(final static)变量,所有实现这个Interface的都要保证实现的东西与这个Interface 定义的行为一致。使用Interface可以让Object(对象)在一定的规范下沟通。如
    public interface TCP协议
    {
     public void 打开端口();
     public void 关闭端口();
    }
    这样的话,只要实现这个Interface的都可以使用这两个方法交流。
    在 Java平台里,它们主要有3个不同点:
    1。一个类(Class)只能继承一个超类(Super class),但是可以实现多个Interface。
    2。在Abstract Class内,你可以有不抽象(Abstract)的方法,即有意义的方法,但Interface不行。
     如
     public abstract class 车
     {
      public int 轮子;
      public abstract void 移动();
      public String 我是什么()
      {
        return "车子";
      }
     }
    3。Interface不属于 继承范围。即不可能成为超类(Super Class)
    (完)这篇文章是根据Sun的FAQ中http://access1.sun.com/FAQSets/newtojavatechfaq.html 的Q13
    翻译得来。 
      

  20.   

    呵呵,我们作出的判断或许是有点武断,但是我觉得目前还是没有找到这个概念存在的意义
    上面的例子在是否使用了abstract关键字的效果是一样的啊而且最主要的是就连sun也没有对这个abstract interface给出一个官方的说法
    也就是说,根本没有一个官方的概念叫abstract interface
      

  21.   

    to ZhouBoTong(周伯童)
    我在下面有补充的,我写这个的时候没有使用编译器执行,所以当时没有发现,可是后来发表后却看了出来,所以在下面添加了补充。
      

  22.   

    to jFresH_MaN(TM)
    我给出的那个例子,如果没有使用abstract interface,那么在CBase中就必须实现setParams方法,而如果这个方法被实现了,则CBase就可以当作一个类被实例化,但是,这个CBase类只是定义了统一输出方法的超类,它并不知道在它子类中的setParams方法将要做些什么,所以这个类是不能被实例化的。而我为什么把abstract定义在interface中而不把 abstract setParams定义在CBase超类中呢,因为这个IA接口还必须提供为客户端调用,同样,setParams方法是不允许客户端调用的,所以必须把这个方法定义为abstract方法。
    当然,有人可能会说,既然setParams方法不能被客户端调用,那么为什么不把它定义在CBase这个超类中呢?其实这只是一个道理:条条大路通罗马,又有什么不可以呢?
    在这里举例,只是为什么说明abstract对于interface的意义是实际存在着的。
      

  23.   

    "在Interface中被定义的 abstract 方法 setParams() 是不允许被客户端调用的"如果在interface里定义了方法,加不加abstract,public这两个关键字都可以被任何类调用,因为在interface里都是默认的。所以没有办法说一定不被客户端调用。abstract public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }和public  interface IA {
        public void run() ;
        abstract public void setParams() ;
    }和public  interface IA {
        public void run() ;
        public void setParams() ;
    }和
    public  interface IA {
        void run() ;
        void setParams() ;
    }没有区别的。另外,java从1995到2005年10年中,无论从sun的官方网站上,还是大部分关于面向对象的书,java的书里,都没有看到区别interface和abstract interface的,无论是从语义上,还是设计理念上,
    thinking in java 对java的语法的讲解已经是非常详细的了,却根本没有提到任何abstract interface。不是说一定要迷信某本书,或者就直接肯定已有的东西都是正确的,不去怀疑,但是查过一些资料,我认为答案是肯定的。不过希望有更多人也一起讨论讨论。在google了一下abstract interface java ,
    发现正式一点的只有oreilly的几本书了用到了这个写法,不过都是97年左右的,就是java 1.1的时候。给下面一个例子,
     http://www.oreilly.com/catalog/javawt/book/
    是讲解java awt 的书,是1997年的。里面关于interface的写法都写成了
    public abstract interface java.awt.event.ComponentListener 这样,可以看它的21章,事件类,大家对这个都很熟悉。
    ComponentListener无论从1.0一直到1.5都是interface,但是在这本书里作者习惯的把abstract加到interface里。
      

  24.   

    abstract 定义的类的话,里面的方法不完全没有方法体~~
    interface 定义的话,里面的方法完全没有方法体~~
    这样的概念,每一个初学java的人应该完全清楚,至于abstract interface这种的定义方式有必要吗?
    本人持观望的态度~~~
      

  25.   

    to zmt_cn(细雨微凉)
    我给出的那个例子,如果没有使用abstract interface,那么在CBase中就必须实现setParams方法没错CBase必须实现setParams方法,但是setParams方法完全可以声明为abstract由它的子类实现,既:即使你没有定义IA接口为abstract,你的CBase仍然可以定义为abstract class,你的CBase里的方法也可以定义为abstract,所以,看不出你的abstract修饰词有任何用处
      

  26.   

    希望zmt_cn(细雨微凉)能给我们一个更具体的例子,一个把接口里的abstract去除就会出错的例子上面2个例子把接口的abstract删除完全没有任何影响
      

  27.   

    好像这个我见过说明interface  就是 abstract interface也就是说  interface = abstract interface