interface 和 abstract interface 有什么区别??

interface 和 abstract interface 有什么区别?? - 故障解答 - 电脑教程网

interface 和 abstract interface 有什么区别??

日期:2006-09-18   荐:
interface 和 abstract interface 有什么区别??今天偶然发现竟然还有叫abstract interface的,以前只知道interface,各位能否给讲讲他们两者之间有什么区别,欢迎大家一起来探讨!!!觉得用不用abstract来修饰interface没多大必要,现在interface已经很好的体现了abstract和接口的作用,用abstract来修饰class产生抽象类还有意义,但是这样用觉得没多大用!interface他的本质上就是一个抽象的类的要求。但是他不指明具体的实现方式。所以说,他也就是abstract。所以我认为,那种说法其实就是废话了。呵呵:)说实话我是头一次听说abstract interface刚才在网上搜了一下,还真没有这个说法 :)如果楼主对interface和abstract class比较有兴趣可以看这个精华帖讨论地比较深入http://community.csdn.net/Expert/topic/3451/3451842.xml?temp=.7041742用abstract interface 来定义一个接口编译没有错误,说明编译器是支持这种写法的,现在就是怀疑是不是两者之间有没有什么区别??刚才测试了一下!确实编译没有问题interface本来就不允许定义方法体,那么这已经是很abstract了,现在使用这个关键字来修饰完全也就是没有必要的了!我认为没有什么意义interface内部本来就没有函数体的,因此也就属于abstract!可以这么去理解:abstract就类似于interface的”超类“,即符合interface的肯定也符合abstract我猜测认为abstract interface 应该是一个函数定义都没有的 interface, 但是测试结果是,两者都可以不定义任何函数。虽然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楼上 意义看不出巨大阿,发而觉得这样的设计不好。而且 耦合性太大了。to zmt_cn(细雨微凉) :强!!!,能不能从设计角度谈谈这方面的认识。to zmt_cn(细雨微凉)看不出有什么特殊意义,你的那个例子把public abstract interface IA { public void run() ; abstract public void setParams() ;}改成public interface IA { public void run() ; public void setParams() ;}其他都不动一样没问题啊我觉得这个abstract和接口里方法前面的那个public差不多,有也可以,没有也死不了人to zmt_cn(细雨微凉) :我把第一行代码的 abstract 去掉了发现也可以正常运行,是不是说明写不写 abstract 都是一个意思?abstract public interface IA { ---〉 public interface IA {差别在于编码时多敲几个字母。对不起,写得太快,是没有反应出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,那么这种设计就是相当必要的。补充: CSub 类也必须定义为abstract, 即: abstract public CSub extends CBase() {}再补充说明: 在Interface中被定义的 abstract 方法 setParams() 是不允许被客户端调用的,但它却必须被分级到诸如电吹风类的类实现,并且也只能在电吹风类中实现,因为需求是——大多数的精确到电吹风类的业务逻辑都有所不同,这时,你们说 interface 中的 abstract 是不是意义重大呢? 楼上说的还是没有什么区别吧。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,两者根本没有区别。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() ; }}to zmt_cn(细雨微凉) :你的程序看了之后,我发现有没有abstract是一样的,呵呵难道是我们都不能看出其中的精华?费解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翻译得来。 学习ing非常感谢各位的支持!!!对于一个观点,最好不要急于否定,最好加以补充,加以完善。再次表示感谢!!!呵呵,我们作出的判断或许是有点武断,但是我觉得目前还是没有找到这个概念存在的意义上面的例子在是否使用了abstract关键字的效果是一样的啊而且最主要的是就连sun也没有对这个abstract interface给出一个官方的说法也就是说,根本没有一个官方的概念叫abstract interfaceto ZhouBoTong(周伯童)我在下面有补充的,我写这个的时候没有使用编译器执行,所以当时没有发现,可是后来发表后却看了出来,所以在下面添加了补充。 to jFresH_MaN(TM)我给出的那个例子,如果没有使用abstract interface,那么在CBase中就必须实现setParams方法,而如果这个方法被实现了,则CBase就可以当作一个类被实例化,但是,这个CBase类只是定义了统一输出方法的超类,它并不知道在它子类中的setParams方法将要做些什么,所以这个类是不能被实例化的。而我为什么把abstract定义在interface中而不把 abstract setParams定义在CBase超类中呢,因为这个IA接口还必须提供为客户端调用,同样,setParams方法是不允许客户端调用的,所以必须把这个方法定义为abstract方法。当然,有人可能会说,既然setParams方法不能被客户端调用,那么为什么不把它定义在CBase这个超类中呢?其实这只是一个道理:条条大路通罗马,又有什么不可以呢?在这里举例,只是为什么说明abstract对于interface的意义是实际存在着的。不论你是上班族,还是求职一族,都可以尝试这个成功之路: 1.不怕没经验 —— 在网上和老师学习,边干边积累经验 2.只需要很小的投资 —— 125元获取网站,创收就从这里开始 3.不用人际关系、看别人脸色 —— 业余时间在网上开展工作 4.不用东奔西跑、租赁铺面 ——— 只要有电脑的地方就可开展工作 5.不承担任何风险 —— 只要努力就有收获6.公平竞争 ———— 会员人人是老板 7.加入方便 —— 凡18岁以上公民皆可参加 8.能够提高自己的能力 —— 有经验的老师会传授网络知识、赚钱的方法,一举两得 9.想做多大就做多大 ———— 看你的努力程度 10.帮助别人成就自己事业 —— 帮助别人就是帮助自己 只要你努力,三天收回投资,三个月以后月收入3000元左右,半年以后月收入过万,最重要的一点,如果你想交了125元以后就天天在家等着钱掉下来的话那就别来加入SOHO,因为天上不会掉馅饼下来的,努力才有收获,才能成功,我现在是乐在其中,你想吗?详情请登陆我的代理网站:http://www.sohomen.cn/?id=givemelove如果您也在武汉,可以到我工作的地点当面咨询!QQ: 1565480邮箱: [email protected]注:加入临时会员的一定要加QQ:1565480;此信息为真实,由于站长时间比较忙,非诚者勿扰,谢谢合作!!!"在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里。abstract 定义的类的话,里面的方法不完全没有方法体~~interface 定义的话,里面的方法完全没有方法体~~这样的概念,每一个初学java的人应该完全清楚,至于abstract interface这种的定义方式有必要吗?本人持观望的态度~~~to zmt_cn(细雨微凉)我给出的那个例子,如果没有使用abstract interface,那么在CBase中就必须实现setParams方法没错CBase必须实现setParams方法,但是setParams方法完全可以声明为abstract由它的子类实现,既:即使你没有定义IA接口为abstract,你的CBase仍然可以定义为abstract class,你的CBase里的方法也可以定义为abstract,所以,看不出你的abstract修饰词有任何用处希望zmt_cn(细雨微凉)能给我们一个更具体的例子,一个把接口里的abstract去除就会出错的例子上面2个例子把接口的abstract删除完全没有任何影响
标签: