抽象类和接口

    对于面向对象编程来说,抽象是它的一大特征。而在Java中,可以通过两种形式体现OOP的抽象:接口和抽象类。在项目实战中会经常用到,尤其是接口,那二者之间有怎样的联系呢,又是怎样区分的呢,接下来就让我们一起来学习一下抽象类和接口吧!

     简单来说,抽象类是一种模板式设计,而接口是一种行为规范,是一种辐射式设计。

     什么式模板式设计?

     大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。

      什么是辐射式设计?

比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

       小例子:门和报警器的例子

        门和报警器:

                           门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念,但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

  从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

1.相同点: 

                 A.两者都不能直接被实例化。

                 B.都是对事务行为和对象的抽象,形成一定的设计模式。

2.不同点:

  • 一个类只能继承一个抽象类,但可以实现多个继承
  • 抽象类中可以包含静态代码块和静态方法,接口则不能。
  • 接口方法都是抽象的,抽象类可以同时包含抽象和非抽象的。
  • 实现接口必须要实现所有方法,而抽象类可以不用全部实现抽象方法,但是其子类也得是抽象类
  • 两者都不能直接实例化,要实例化的话就涉及到多态了。

 

   抽象类:

  1、包含一个或多个抽象方法的类本身必须被声明成抽象的。

  2、除了抽象方法之外,抽象类还可以包含具体数据和具体方法

  3、扩展抽象类的两种选择(抽象方法的具体实现在子类中):

       A、 抽象类中定义部分抽象类或不定义抽象类方法,这样就必须将子类也标记为抽象类。

       B、定义全部的抽象方法,这样子类就不是抽象的了

     

   4、不能直接被实例化,可以间接使用

   5、一个类如果继承一个抽象类,必须实现该抽象类里声明的抽象方法

    若不实现,需要将自己声明为抽象类(这可能会是个提问)

       

接口:

1、一个类可以实现(implement)一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象

2、接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义

 

3、接口中的所有方法自动地属于public,因此,声明方法时,不必提供关键字public,不过,实现接口时,必须把方法声明成public,否则,编译器将认为这个方法的访问属性是包可见性,即类的默认访问属性。

4、接口中不能含有实例域或静态方法,但却可以包含常量

 

5、接口不能被实例化

6、接口中定义的方法都为抽象方法

 

注:当多个接口中有同名、同参、返回值类型不同的方法时,会产生命名冲突(因为接口支持多继承,防止出现二义性)

7、接口之间允许多继承(java只在接口允许多继承)

8、Java 8用默认方法与静态方法这两个新概念来扩展接口的声明

 

接口和抽象类该什么时候用?

1、接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则
2、抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。

 

 理解:

1、抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。...

2、抽象类不能直接new对象,它只能被继承,而且单一继承。也就是说它把公共的东西抽象出来,子类可以调用父类的方法,也可以拓展自己的功能,就像子承父业一样。接口可以被多次继承,这是和抽象类的最大区别。也就是说接口是一个公共用品谁都可以拿来用的,不想抽象类,不是他的子类是不能调用的。希望对你有帮助

3、当描述一组方法的时候使用接口  当描述一个虚拟的物体的时候使用抽象类

 

二者区别:

 

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

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

 

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

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

 

5、抽象方法要被实现,所以不能是静态的,也不能是私有的

6、抽象类主要用来抽象类别,接口主要用来抽象功能.

7、抽象类可以有构造方法,接口中不能有构造方法。

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值