interface,abstract class 的区别

问题描述

接口是抽象类的变体,新型多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是publicstaticfinal的。

解决方案

解决方案二:
你要问啥啊?
解决方案三:
对啊,你要问啥啊?
解决方案四:
Java中interface接口与abstractclass抽象类的区别interface和abstractclass是Java中实现多态的基础,都很有用,但也有一些区别:  Java代码  1.interface被继承时用的关键字是implements,而且可以同时implements多个interface,而abstractclass被继承时用的关键字是extends,而且只能同时extends一个abstractclass。  2.interface内定义的方法都是public的,而abstractclass内的则不一定。  3.interface内定义的成员对象都是static&final的,而abstractclass不是(一定不能是final)  4.interface的方法不能有默认实现,只有一个申明,而abstractclass内申明abstract的方法不能有实现,非申明abstract的方法可以有默认实现。  5.interface被implements时,所有方法都必须被实现,必须申明是public的,而abstractclass被extends时只有abstract的方法才必须被实现,别的有默认实现的直接被继承过来。  注:不能创建接口或抽象类的实例。  例子:  Java代码  publicinterfaceInstrument{  inti=5;//static&final  //can'thavemethoddefinitions:  voidplay();//automaticallypublic  voidadjust();  }  Java代码  publicabstractclassAbstractCachedTable{  publicHashtabletable=newHashtable();  abstractpublicvoidrefresh();  publicObjectget(Objecto){  Objecttarget=null;  target=table.get(o);  returntarget;  }  }  一般情况下,建议使用interface(因为能同时implements多个interface的特性,能更好地实现多态),当需要有默认实现和成员对象时才考虑abstractclass。  在Java中所有的对象都用类来描绘,但是不是每一个类都用来描绘对象的。用来描绘某一类对象共有的本质,这就是抽象。比如:形状存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类(这儿的抽象类并不是abstractclass翻译而来的,它包括interface和abstractclass)是不能够实例化的。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。  从语言层面上面来讲:abstractclass可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也即interface是staticfinal的),所有的成员方法都是abstract的。从这种角度来说,interface是abstarctclass的一种特殊情况。abstractclass可以提供某些方法的部分实现,而interface不可以,这大概就是abstractclass唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而interface做不到这一点,如果向一个interface里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行。而从设计出发:假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstractclass或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:  abstractclass:  Java代码  abstractclassDoor{  abstractvoidopen();  abstractvoidclose();  }  interface:  Java代码  interfaceDoor{  voidopen();  voidclose();  }  其他具体的Door类型extendsabsractclass或者implementsinterface就可以了。  看起来好像使用abstractclass和interface没有大的区别。  但是现在如果要求Door加上报警的alarm功能,我们应该如何去设计程序的结构呢?  解决方案一:  简单的在Door的定义中增加一个alarm方法,如下:  Java代码  abstractclassDoor{  abstractvoidopen();  abstractvoidclose();  abstractvoidalarm();  }  或者  Java代码  interfaceDoor{  voidopen();  voidclose();  voidalarm();  }  那么具有报警功能的AlarmDoor的定义方式如下:  Java代码  classAlarmDoorextendsDoor{  voidopen(){…}  voidclose(){…}  voidalarm(){…}  }或者  Java代码  classAlarmDoorimplementsDoor{  voidopen(){…}  voidclose(){…}  voidalarm(){…}  }  简单的在abstractclass添加abstractvoidalarm()方法或者在interface中加一个alarm()方法?但是如果这样,在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变。  这种方法违反了面向对象设计中的一个核心原则ISP(InterfaceSegregationPriciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反之依然。  解决方案二:  既然open、close和alarm属于两个不同的概念,根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有:这两个概念都使用abstractclass方式定义;两个概念都使用interface方式定义;一个概念使用abstractclass方式定义,另一个概念使用interface方式定义。  显然,由于Java语言不支持多重继承,所以两个概念都使用abstractclass方式定义是不可行的。后面两种方式都是可行的,但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。  如果两个概念都使用interface方式来定义,那么就反映出两个问题:1、我们可能没有理解清楚问题领域,AlarmDoor在概念本质上到底是Door还是报警器?2、如果我们对于问题领域的理解没有问题,比如:我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的,那么我们在实现时就没有能够正确的揭示我们的设计意图,因为在这两个概念的定义上(均使用interface方式定义)反映不出上述含义。  如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstractclass在Java语言中表示一种继承关系,而继承关系在本质上是"isa"关系。所以对于Door这个概念,我们应该使用abstarctclass方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定义。如下所示:  Java代码  abstractclassDoor{  abstractvoidopen();  abstractvoidclose();  }  interfaceAlarm{  voidalarm();  }  ClassAlarmDoorextendsDoorimplementsAlarm{  voidopen(){...}  voidclose(){...}  voidalarm(){...}  }  这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计意图。其实abstractclass表示的是"isa"关系,interface表示的是"likea"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的,比如:如果我们认为AlarmDoor在概念本质上是报警器,同时又具有Door的功能,那么上述的定义方式就要反过来了。  结论  abstractclass和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。
解决方案五:
楼主的问题在标题很多时候接口做的事情确实只用抽象类就可以解决
解决方案六:
概念上讲,第一,二者不在一个层级上,抽象类可以实现接口,但接口却无法继承抽象类。第二,作用域不同,接口体现了相同类别或不同类别事物的归纳,而抽象类更多地体现在相同类别事物的归纳。第三,开放性不同,接口中的方法都是public的,而抽象类不同。接口的开放性高于抽象类。第四,抽象类利于代码的复用。Java语法方面3楼讲的很清楚
解决方案七:
3楼和5楼都解释的不错
解决方案八:
引用4楼keeya0416的回复:

楼主的问题在标题很多时候接口做的事情确实只用抽象类就可以解决

因为接口就是多个抽象类的集合。
解决方案九:
楼主其实并不是想问什么问题,只是将一些顿悟分享给大家..顶.
解决方案十:
引用一个视图给你看看:AbstractclassInterface实例化不能不能类一种继承关系,一个类只能使用一次继承关系。可以通过继承多个接口实现多重继承一个类可以实现多个interface数据成员可有自己的静态的不能被修改即必须是staticfinal,一般不在此定义方法可以私有的,非abstract方法,必须实现不可有私有的,默认是public,abstract类型变量可有私有的,默认是friendly型,其值可以在子类中重新定义,也可以重新赋值不可有私有的,默认是publicstaticfinal型,且必须给其初值,实现类中不能重新定义,不能改变其值。设计理念表示的是“is-a”关系表示的是“like-a”关系实现需要继承,要用extends要用implements
解决方案十一:
补充一下,上面是属于abstractclass,下面是属于interface,其实要真正体会两者的区别,实际编程时最好的方式
解决方案十二:
又不说清楚
解决方案十三:
interface里面只可以声明方法,abstractclass除了可以声明方法外,还可以声明字段属性;interface支持多继承,而abstractclass只能单继承

时间: 2024-07-28 13:35:16

interface,abstract class 的区别的相关文章

c#中的interface abstract与virtual

  interface用来声明接口1.只提供一些方法规约,不提供方法主体  如  public interface IPerson {  void getName();//不包含方法主体  }2.方法不能用public abstract等修饰,无字段变量,无构造函数.3.方法可包含参数  如    public interface IPerson  {   void getAge(string s);  }   一个例子(例1):  public interface IPerson  {   

温故而知新:new与override的差异以及virtual方法与abstract方法的区别

先直接看代码吧: using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { B b = new B(); b.Method1(); Console.ReadLine(); } } class A { public virtual void Method1() { Console.WriteLine("A.Method1"); } } class B :

[C#]中abstract类和interface概念和区别讲解

  abstract(抽象)类和interface(接口)是面向对象编程中两个概念,但是学了很多年编程的程序员有时对这两个概念的区分仍然不是很清楚.下面就讲解abstract类和interface的概念和区别. abstract(抽象)类 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法. 抽象类不能被实例化. 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类. 具体派生类必须覆盖基类的抽象方法. 抽象派生类可以覆盖基类的抽象方法,也可以不

java-基础-Interface、abstract类、Static class 、non static class的区别

Interface与abstract类的区别. 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类.接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法.抽象类中的成员可以是private.默认.protected.public的,而接口中的成员全都是public的.抽象类中可以定义成员变量,而接口中

Java的abstract和interface的区别 (1/2)

其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据. 一.理解抽象类 abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽

PHP中的Abstract Class和Interface

最近开始学习PHP+MySQL,记录下学习过程中的重点内容吧,然后考虑把开发网站的过程也写一个系列Blog. 这篇blog主要介绍了Abstract Class和Interface的区别. Abstract Class 什么是Abstract Class( 抽象类) 和C++中的抽象类概念一样,包含有纯虚函数(Java和Php中叫abstract method)的类叫做Abstract Class. 我们有时候也把abstract Class叫做base class,因为base class不能

abstract class && Interface 比较

比较 zz From 城市WebClub abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解

java中abstract class和interface学习笔记

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.本文将

用最简单的话概括 抽象类 和接口的区别?

问题描述 在网上看了些关于这方面的资料,感觉自己的理解还是不透确.我是这样理解的,从设计层次考虑:如果基类的方法在子类中都需要,则用抽象类定义.如果某些方法在某些子类中不需要,则这些方法应该定义在接口中.比如abstractclassdoor{close();open()}而Alarmdoor需要报警行为,但是可能其他门并不需要这个行为,所以可以将报警方法定义在一个接口中.interfaceArmdoor{alarm();}classAlarmdoor()extendsdoorimplentsA