Java 纯抽象类和接口
谁能告诉我一个完全抽象的类和一个接口之间到底有什么区别 抽象类也可以将其所有方法都作为抽象类。接口的所有方法都是抽象的。在这种情况下,两者之间的主要区别是什么Java 纯抽象类和接口,java,Java,谁能告诉我一个完全抽象的类和一个接口之间到底有什么区别 抽象类也可以将其所有方法都作为抽象类。接口的所有方法都是抽象的。在这种情况下,两者之间的主要区别是什么 纯抽象类和接口之间是否有区别?界面的用途是什么?在使用接口的地方,我们可以使用纯抽象类吗 抽象类可以提供实现,即(公共、受保护、私有)方法体。接口只能声明公共方法签名。这些方法必须通过实现接口的类来实现(以方法体的形式)。在Java和C#中,可以使用多个接口来派生,并且只能从单个类继承,每个接口都是隐式抽象的:接口体中的每个方法声明都是隐
纯抽象类和接口之间是否有区别?界面的用途是什么?在使用接口的地方,我们可以使用纯抽象类吗 抽象类可以提供实现,即(公共、受保护、私有)方法体。接口只能声明公共方法签名。这些方法必须通过实现接口的类来实现(以方法体的形式)。在Java和C#中,可以使用多个接口来派生,并且只能从单个类继承,每个接口都是隐式抽象的:接口体中的每个方法声明都是隐式抽象和公开的 抽象类具有可以包含实现的方法。抽象方法可以是公共、受保护或默认访问(包可见)。与接口不同,抽象类可以包含非静态和最终的字段 另请参见:
和
一个类可以实现多个接口,但只能从一个类(抽象类或其他类)扩展。如果需要指定接口,则应使用接口,以便类可以实现多个接口。有三个区别:
可以将接口用于多重继承,但不能将抽象类用于多重继承
默认情况下,接口中的所有方法都是公共的,在抽象类中,只有您设置为抽象的方法才需要声明为公共的。要完成前面的回答: 接口是一个“合同”。如果一个类实现了一个接口,它必须提出接口中列出的所有服务 抽象类是一个骨架。它定义了它的扩展类工作的特定方式,同时允许它们的一些空闲空间(抽象方法)是唯一的
一个纯抽象类做着与接口相同的事情,但有唯一扩展的问题,因此,对我来说,它没有兴趣我只想解决一点(主要是因为其他问题已经解决): “在使用接口的地方,我们可以 使用纯抽象类?”
理论上,你可以。但是,在某种程度上,您将失去灵活性和松耦合。更可取的做法是编写接口代码并传递接口,特别是在控制反转(IoC)场景中,从集成的角度来看,因为这允许更大的可扩展性。因为问题是关于纯的抽象类,所以我认为答案将与继承和范围相关。这是我自己想了很多次的事情,这就是我想到的 显然,与多重继承相关的特性已经在前面得到了回答,所以我将不讨论其中任何一个。但范围是很大的 在接口中您不能定义成员的访问修饰符,因为它们是隐式公共的,…您正在为它的最终实现定义公共接口。这里有一个重要的区别,因为您可以在纯抽象类中定义受保护的抽象成员 从这样的类定义继承将强制继承者实现抽象成员,但将其作用域私有给类的使用者(尽管它必须定义为
受保护的
,因此除非类被标记为密封的
,否则其他继承者将有权访问)
本质上,您可以使用纯抽象类定义私有接口。这是否是一个好主意是一个完全不同的问题,但我看到它的一个很好的用途是加强设计模式和标准化类设计
嗯
这不是一个非常理论化的解释,但从程序上来说,它是完全正确的
*抽象类可以有私有方法,但不能有抽象私有方法。选择纯抽象而不是接口的一个原因是强制子类实现由超类实现的特定方法 例如(在Java中) 假设您希望所有扩展类都实现toString()、equals()和hashCode() 您可以为该契约创建一个名为ForceSomeMethods的接口,但这些方法是由对象隐式实现的
使ForceSomeMethods成为一个纯抽象类,并将toString()等作为抽象方法,所有子类都将被迫实现这些方法。而抽象类可以实现方法。这不是答案,因为没有提到一个非常重要的方面:抽象类可以实现成员。@Wim:true,但是如果你阅读原始问题的第二段,很明显OP只对那些没有实现任何方法的抽象类感兴趣,因此看起来几乎像接口。我认为这甚至不是一个重要的方面。当您看到接口的多重继承时,通常会出现糟糕的设计。从客户端代码的角度来看,“纯”抽象类和接口实际上是无法区分的;子类必须标记为
final
。这是一个非常有趣的答案,我在其他地方没有看到过。不是全部答案,而是一个非常有价值的细节
Interface Abstract Class
Extend Class No Yes
Extend Abstract Class No Yes
Implement Interface Yes(Extend Interface) Yes
Variables Public Static Final Public/Protected/Private/static/final/transient/volatile
Contain Non-Public Method No Public/Protected/*Private
Contain Abstract Method Yes Yes
Contain No-Body, Non-Abstract Method Yes No
Contain Defined Method No Yes
Contain Main Method No Yes