接口和抽象类的区别

Posted shelley-al

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口和抽象类的区别相关的知识,希望对你有一定的参考价值。

 一,抽象类

关键字: abstract
使用目的:若所有子类拥有共同的特性,可以把这个特性放到一个抽象类中,子类继承此抽象类。
特点:
1.不能被实例化;ClassName en=new ClassName();//这样会报错。
2.抽象成员必须包含在抽象类中。
3.抽象类除了抽象成员外,还可以包含别的成员(不用关键字 abstract)。
4.子类继承抽象父类后,必须把父类中的所有抽象成员都重写(非抽象成员不必重写)。除非子类也是个抽象类。
5.抽象成员的访问修饰符不能是private。
6.抽象类是有构造函数,虽然不能被实例化。
7.abstract不能用于字段成员,可定义成属性。
8.abstract用于方法时,方法不能定义主体(内容)。
9.抽象类也可以实现接口,但要把接口的成员前面标记个abstract。

代码示例:

技术图片
技术图片
static void Main(string[] args)
{
    Person person = new Person();
    person.ShowHello();
    Console.ReadKey();
}
//抽象类
public abstract class Humen
{
    public Humen() { Console.WriteLine("Abstract Class .ctor"); }

    public abstract void ShowHello();
}
public class Person : Humen
{
    public override void ShowHello()
    {
    Console.WriteLine("Hello");
    }
}
技术图片
技术图片

实现结果:

技术图片

二, 静态类

关键字: static
使用目的:不需要实例化,可以直接类名引用静态方法。比如 工具类。
特点:
1.相似于abstract使用。
2.静态成员在整个程序退出时才释放资源,所以尽量别写静态字段、属性。最好是静态方法。

三. 接口

关键字: interface
使用目的:抽象类所拥有的共性,也可以概括为:为了多态。
特点:
1.接口中只能包含方法。(方法、属性、索引器、事件)
2.接口中的方法不能有任何实现
3.接口中的成员不能有任何访问修饰符(哪怕是public)
4.接口不能被实例化
5.实现接口的类,必须实现接口的所有成员(这里跟抽象类一样)
6.类不能多继承,所以在某些情况下,只能用接口来代替。接口可以多实现(一个类可以继承多个接口,而只能继承一个类)
7.接口的主要目的就是为了实现多态
8.当一个类,同时继承了某个类,并且也实现了某些接口的时候,必须要将继承的类写在第一个(如果一个类同时继承了父类和接口的时候,要把父类写在最前面)
9.当多个类,都具有某个或某几个功能时(方法),但是这几个类型又不属于相同的系列(这几个类型没有共同的父类,就不能用抽象类。),所以这时,为了实现多态就可以考虑把这几个类型共有的方法提取到一个接口中,让这几个类型分别实现该接口
10.当父类实现接口,子类继承父类。那么 接口就可以引用子类
11.不要在一个接口中写过多的方法,避免造成接口污染。可编写多个接口,在每个接口中,分别定义方法
12.实现接口方法的时候,不要有override关键字,直接跟平常定义一样
13.接口方法的显示实现,如果多个接口里有相同的方法名。那么第一个方法名默认的引用的是排在最前面的接口,如果要使用后面接口的方法,就要显示实现:接口名.方法名。访问修饰符是private

四,接口和抽象类的区别

  接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。

  抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。

  所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。

  当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

 

  抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

五,抽象类和接口使用案例

  什么时候把方法放到父类中 还是接口里:当一个父类派生出5个子类时,所有子类中只有3个需要一个功能,也就是说不是所有的子类都需要此功能,那么就可以把次功能放到一个接口里,各子类进行单独的实现。接口为了更好的约束子类。

以上是关于接口和抽象类的区别的主要内容,如果未能解决你的问题,请参考以下文章

接口和抽象类的区别

请说说接口和抽象类的区别?

java 中interface和抽象类的区别

设计模式学习笔记 接口vs抽象类的区别?是否要为每个类定义接口?

五. 面向对象高级特性5. 接口和抽象类的区别

、接口与类的区别;