接口和抽象类之间到底有什么区别?
当前回答
我正在建造一座300层的大楼
建筑的蓝图界面
例如,Servlet(I)
建筑高达200层-部分完工-摘要
部分实现,例如泛型和HTTPservlet
建筑施工完成混凝土
完整实现,例如,自己的servlet
界面
我们对实现一无所知,只知道需求。我们可以去找一个接口。默认情况下,每个方法都是公共的和抽象的这是一个100%纯抽象类如果我们宣布公开,我们就不能宣布隐私和受保护如果我们声明抽象,我们就不能声明final、static、synchronized、strictfp和native每个接口都有公共的、静态的和最终的序列化和瞬态不适用,因为我们无法在接口中创建实例非挥发性,因为它是最终的每个变量都是静态的当我们在接口内声明变量时,我们需要在声明不允许实例和静态块
摘要
部分实施它有一个抽象的方法。此外,它使用混凝土对抽象类方法修饰符没有限制抽象类变量修饰符没有限制除了abstract,我们不能声明其他修饰符初始化变量没有限制
摘自DurgaJobs网站
其他回答
在实用性方面(JAVA),抽象类和接口之间的主要区别是抽象类可以保存状态。除了保持状态,我们还可以使用Interface实现其余操作。
我们在接口和抽象类之间存在各种结构/语法差异。还有一些不同之处
[1] 基于场景的差异:
当我们希望限制用户创建父类的对象时,抽象类被用于场景中,并且我们相信将来还会添加更多的抽象方法。
当我们确信不能提供更多抽象方法时,必须使用接口。然后只发布一个接口。
[2] 概念差异:
“我们是否需要在未来提供更多抽象方法”,如果是,则将其设为抽象类,如果否,则设为接口。
(在java 1.7之前最合适和有效)
抽象类和接口之间的关键技术差异是:
抽象类可以有常量、成员、方法存根(没有主体的方法)和定义的方法,而接口只能有常量和方法存根。抽象类的方法和成员可以以任何可见性定义,而接口的所有方法都必须定义为public(默认情况下定义为public)。继承抽象类时,具体的子类必须定义抽象方法,而抽象类可以扩展另一个抽象类,父类的抽象方法不必定义。类似地,扩展另一个接口的接口不负责从父接口实现方法。这是因为接口不能定义任何实现。子类只能扩展一个类(抽象或具体),而接口可以扩展或类可以实现多个其他接口。子类可以定义具有相同或更少限制性可见性的抽象方法,而实现接口的类必须定义具有完全相同可见性(公共)的方法。
其实很简单。
您可以将接口视为一个类,它只允许有抽象方法,而不允许有其他方法。
因此,接口只能“声明”而不能定义您希望类具有的行为。
抽象类允许您声明(使用抽象方法)和定义(使用完整方法实现)您希望类具有的行为。
常规类只允许您定义而不是声明您希望类具有的行为/动作。
最后一件事,
在Java中,可以实现多个接口,但只能扩展一个(抽象类或类)。。。
这意味着定义行为的继承被限制为每个类只允许一个。。。例如,如果你想要一个从类a、B和C中封装行为的类,你需要执行以下操作:类a扩展B,类C扩展a。。这是一个有点迂回的方式来拥有多重继承。。。
另一方面,您可以简单地执行接口:接口C实现A、B
因此实际上,Java只在“声明的行为”(即接口)中支持多重继承,并且只支持具有定义行为的单一继承。。除非你像我描述的那样。。。
希望这是合理的。
总结起来最简单的方法是:
完全抽象,除了默认和静态方法;虽然它有默认和静态方法的定义(方法签名+实现),但它只有其他方法的声明(方法签名)。受比类更宽松的规则约束(类可以实现多个接口,接口可以从多个接口继承)。所有变量都是隐式常量,无论是否指定为公共静态final。所有成员都是隐式公共的,无论是否指定为公共成员。通常用于保证实现类将具有指定的特性和/或与实现相同接口的任何其他类兼容。
同时,抽象类是:
从完全抽象到完全实现,具有一个或多个抽象方法的倾向。可以包含声明和定义,声明标记为抽象。一个完整的类,并且受制于管理其他类的规则(只能从一个类继承),条件是它不能实例化(因为不能保证它完全实现)。可以具有非常量成员变量。可以实现成员访问控制,将成员限制为受保护、私有或私有包(未指定)。通常用于提供可由多个子类共享的尽可能多的实现,或者提供程序员能够提供的尽可能的实现。
或者,如果我们想将其归结为一句话:接口是实现类所拥有的,而抽象类是子类所拥有。
推荐文章
- Java抽象接口
- 什么是依赖倒置原则?为什么它很重要?
- 为什么在Python方法中需要显式地有“self”参数?
- 如何在方法中访问“静态”类变量?
- 为什么c#不提供c++风格的'friend'关键字?
- String, StringBuffer和StringBuilder
- 如何在python抽象类中创建抽象属性?
- 存储库和服务层的区别?
- DDD -实体不能直接访问存储库的规则
- 为什么STL如此严重地基于模板而不是继承?
- 如何在Objective-C中声明类级属性?
- 面向方面编程与面向对象编程
- c++中类似于java的instanceof
- 在python中遍历对象属性
- 将类代码分离为头文件和cpp文件