首页 > 技术文章 > 抽象类和接口以及二者的区别

lyr999736 2018-04-18 23:46 原文

一、抽象类

  关键字:abstract,抽象的,可以修饰类和方法。

  1)抽象方法,父类声明一个方法但不能提供方法实现,该方法的实现子类提供,这样的方法交抽象方法。

  2)抽象类:有一个或更多抽象方法的类称为抽象类,前提是继承基础之上。抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。

  1.abstract修饰类:抽象类

   (1)不可被实例化

   (2)抽象类有构造器,可以重载多个=>凡是类都有构造器 

   (3)抽象方法所在类一定是抽象类

   (4)抽象类里可以定义常量,变量,可以定义非抽象方法,但是方法包括{},也可以定义静态方法,方法也要有{},抽象方法不需要{}。

  2.abstract修饰方法

   (1)格式:没有方法体,包括{}。

   (2)意义:抽象方法保留了功能,而且执行交给抽象类的子类,由子类重写此抽象方法。

   (3)若子类继承抽象类,并重写所有抽象方法,则此类是一个实例类,即可实例化。反之,若没有重写所有方法,意味着此类仍有抽象方法,则必须声明类为抽象的。

  3.abstract使用的限制   

   (1)不能和final一起使用:final是最终的,不能被修改,继承后不能重写。

   (2)不能和static一起使用:"类名.方法名"调用方法,但abstract修饰的方法没有方法体。

   (3)不能用来修饰属性:属性没有重写的说法。

   (4)不能用来修饰构造器:构造器不能被重写。

   (5)不能和private一起使用:抽象方法是建立在继承的前提下。

二、接口

  关键字:interface。是一个特殊的抽象类,所有的属性值是常量,所有的方法是抽象方法。Jdk1.8以上可以定义静态方法,但是必须含有{},通常是由类实现接口然后重写抽象方法。

三、对比

  (1)抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

  (2)抽象类要被子类继承,接口要被类实现

  (3)接口只能做方法申明。抽象类中可以做方法申明,也可以做方法实现。

  (4)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

  (5)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

  (6)抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。

  (7)抽象类里可以没有抽象方法。

  (8)如果一个类里有抽象方法,那么这个类只能是抽象类。

  (9)抽象方法要被实现,所以不能是静态的,也不能是私有的。

  (10)接口可继承接口,并可多继承接口,但类只能单根继承。

  (11)接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。

    

四、什么时候使用抽象类和接口

  (1)如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。

  (2)如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

  (3)如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

 

推荐阅读