Java和C#中的接口和抽象类之间的区别

作者: Laura McKinney
创建日期: 1 四月 2021
更新日期: 13 可能 2024
Anonim
java 080308 【掌握】抽象类与接口区别
视频: java 080308 【掌握】抽象类与接口区别

内容


接口和抽象类都导致OOP中的“不完整类型”。有时我们需要一个超类来定义“做什么”,而不是“怎么做”,而是如何根据派生类的需要来实现部分工作,“接口为此提供了解决方案。有时我们需要一个超类类,该类定义了一些可以由派生类实现的通用结构和一些可以由派生类使用的指定结构,抽象类”为此提供了解决方案。接口和抽象类之间的根本区别是接口是完全不完整的,而抽象类是部分不完整的。

  1. 比较表
  2. 定义
  3. 关键差异
  4. 结论

比较表

比较基础接口抽象类
基本的如果仅了解要求而不是要求的知识,则可以使用“接口”。当您部分了解实现时,可以使用“抽象类”。
方法接口仅包含抽象方法。抽象类包含抽象方法和具体方法。
方法的访问修饰符接口方法始终为“公共”和“抽象”,即使我们未声明。因此,可以说是100%的纯抽象类。抽象类中的方法必须是公共的和抽象的不是强制性的。它也可以有具体的方法。
方法的受限修饰符不能使用以下修饰符声明接口方法:
公开:私人且受保护
摘要:最终,静态,同步,本机,strictfp。
对抽象类变量的修饰符没有任何限制。
变量的访问修饰符无论我们是否声明,接口变量允许使用的Acess修饰符都是public,static和final。抽象类中的变量不必是public,static,final。
变量的限制修饰符接口变量不能声明为私有,受保护,瞬时,易失。对抽象类变量的修饰符没有限制。
变量初始化接口变量必须在声明时进行初始化。不必在声明抽象类变量时对其进行初始化。
实例和静态块在接口内部,您不能声明实例或静态块。抽象类允许在其中包含一个实例或静态块。
建设者您不能在接口内部声明构造函数。您可以在抽象类中声明构造函数。


接口定义

Java不允许多重继承。也就是说,一个类不能一次继承一个以上的类。一个例子可以解释其背后的原因。假设我们有两个父类A和B以及派生类C。派生类C继承了类A和B。现在,类A和类B都具有方法set(),那么对于类C,应该继承哪个类的set()方法将是一个问题。解决此问题的方法是“接口”。

接口是一个纯抽象类。用于创建接口的关键字是“ interface”。由于接口内部的所有方法都是完全抽象的。该接口仅指定类必须执行的操作,但未定义其执行方式。仅仅因为接口内声明的所有方法都是抽象的,所以没有为接口创建任何实例。 Java中“接口”的一般形式为:

access_specifier 接口 interface_name {return-type method-name1(parameter-list); return-type method-name2(parameter-list);输入final-varname1 = value;输入final-varname2 = value; // ...返回类型method-nameN(parameter-list);输入final-varnameN = value; }

将访问说明符声明为公共,因为类需要实现接口。

在C ++中,我们没有“接口”的概念。但是,Java和C#很好地定义了接口。

Java接口:

  • 默认情况下,接口的变量始终为public,static和final。
  • 变量必须在声明时进行初始化。
  • 绝对不能将变量声明为私有,受保护,瞬态和易失性。
  • 接口的方法始终是公共和抽象的,而决不能将它们声明为私有,受保护,最终,静态,同步,本机和strictfp。
  • 您不能在接口内部声明任何构造函数,因为构造函数的主要目的是初始化类变量,但是,在声明它时,接口变量将被初始化。
  • 接口可以继承其他接口,但是实现此类接口的类必须实现所有继承的接口的方法。
  • 一个类一次可以继承多个接口,并且它必须实现所有继承接口的所有方法。

用Java实现接口的一般形式:


class class_name实现Interface_name {// class-body}

对于继承接口,类使用关键字“ implements”,并且该类实现继承的接口声明的所有方法。

C#中的接口:

C#中的接口与Java中的接口几乎相似,除了:

  • C#中的接口未声明变量。
  • 接口的名称以大写字母I开头,并以冒号(:)继承。

在C#中实现接口的一般形式:

class class_name:interface_name {// class-body}

抽象类的定义

包含一个或多个抽象方法的类称为抽象类,并且使用关键字“抽象”将一个类声明为抽象,并在类声明的开头加上“ class”关键字。由于抽象类包含抽象方法,因此它构成为不完整的类型。因此,您不能创建抽象类的对象。每当一个类继承一个抽象类时,它都必须实现该抽象类的所有抽象方法(如果没有),则还必须将其声明为abstract。抽象属性将被继承,直到实现抽象方法的完整实现。

抽象类也可以包含具体方法,派生类可以直接使用这些方法。但是,您不能在抽象类内部声明抽象构造函数或抽象静态方法。 Java中抽象类的一般形式如下:

抽象类class_name {abstract method_name1();抽象method_name2(); :return_type method_name3(parameter_list){//具体方法} return_type method_name4(parameter_list){// concrete方法}};

Java和C#中抽象类的概念相似。抽象类在C ++中略有不同。

在C ++中,如果一个类至少具有一个虚函数,则该类将成为抽象类。代替关键字“抽象”,使用关键字“虚拟”来声明抽象方法。

  1. 当您了解“需要什么”但不了解“如何实现”时,则必须使用接口。另一方面,如果您知道需求是什么,而又部分知道如何实现,则可以使用抽象类。
  2. 接口的所有方法都是抽象的,但是抽象类具有一些抽象的方法和一些具体的方法。
  3. 接口内部的方法是公共的和抽象的,因此,它也称为纯抽象类。另一方面,摘要内部的方法不限于仅公开和抽象。
  4. 接口方法永远不能是私有的,受保护的,最终的,静态的,同步的,本机的或strictfp的。另一方面,对抽象类的方法没有任何限制。
  5. 无论我们是否声明它们,接口中的变量都是公共变量和最终变量,而抽象类的变量没有限制,只能是公共变量和最终变量。
  6. 接口中的变量永远不能是私有保护的瞬态或易变的,而抽象类中的变量没有任何限制。
  7. 接口的变量必须在声明期间初始化。另一方面,抽象类中的变量可以随时初始化。
  8. 在接口内部,无法声明实例或静态块,但可以在抽象类中声明实例或静态块。
  9. 您不能在接口内定义构造函数,而可以在抽象类内定义构造函数。

结论:

当需要创建一个基类,该基类包含可以由派生类根据其需要实现的方法的一般形式时,接口和抽象类的概念可以帮助实现这一点。