抽象类和接口的区别(什么时候用抽象类,什么时候用接口?)

什么时候用

如果在你的程序中有下面的这些情况,那你就要考虑使用抽象类了:

  1. 你想要在几个关联紧密的类之间共享代码

  2. 你想要继承抽象类的那些类有一些公共方法或属性抑或是有修改protected或private属性的权限。这时你也可以考虑使用抽象类。

  3. 你想要声明非静态或者是非最终执行的属性。你可以获得并且修改这些属性所属的对象的状态。

当有下面的情形的时候,我们可以考虑使用接口:

  1. 用相互之间无关的类实现你的接口。举例来说,可比较的和可克隆的那些接口可以使用无关的类来实现。

  2. 你想指定一个特定数据类型的行为,但是不用去关心由谁来实现这一行为。

  3. 你想要利用多继承的优势

区别

  • 抽象类是对类的抽象(是什么),接口是对行为的抽象(做什么)。

  • 如果行为跨越不同类的对象,可使用接口,对于一些现实的类对象,用继承抽象类。

  • 抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确认,预先定义。

  • 抽象类和接口的使用就是is和has的区别。如果就是某种玩意,比如人相对于男人,小孩,女人就是is,那么就应该是抽象类,因为他们都是人,有人所有的特点。而可行动相对于人,汽车,飞机就是has,那么就是接口,因为他们有这样的功能,但不具有is的特征。

  • 第三种说话

抽象类与接口最大的区别在于抽象类的属性是可以继承的。
而接口只有常量。
一般情况下我们尽可能使用接口,因为接口从方法上去描述对象特性,可以实现多个接口,而继承只能继承一个。
那么我们什么时候要调用到抽象类呢?
那是因为子类必须含有父类的某个特征属性。
比如人跟鱼,人跟鱼都需要呼吸氧气作为生存的需要,这个呼吸是一个方法,所以就需要接口了。
当你需要区分人在空气中用肺呼吸,鱼在水中用鳃呼吸,那就要用到抽象类了。

为什么接口中只能定义常量?

学习完接口后,知道了接口中只能定义常量,即使你的代码是这样写的:public int a,底层语言也会默认加上public static final int a转为常量,那么这是为什么呢?

我们都知道,接口中不能定义方法的实现,但是抽象类中是可以定义变量、常量以及方法的实现的,所以我们可以将接口看为比抽象类更高层次的抽象,是特殊的抽象类。加入接口可以定义变量,因为接口中的方法都是抽象的,我们无法通过行为,例如set()方法来修改这一属性值

或许有些人会说我们可以让实现接口的类的对象去修改接口的属性值,如果真的这样的话,比如接口中我定义了变量a,而且我们通过实现本接口的类B的对象改变了a的值,那么其他实现本接口的类B、类C中的变量a得知都要随着改变(因为它们实现的都是一个接口,处理的也是同一个变量,而变量的处理方式为传址),那么就会造成想要实现本接口的类却不知道接口里现在变量a到底是什么值,就会造成混乱

而且,抽象的概念是将不可变的东西提取出来封装到一起,将可变的东西放到实现中去,接口的设计理念既然是高层的抽象,那么就应该定义为不可变的东西,如果接口中定义了变量,就说明带了可变的成分,就不是高层抽象了。

小结:接口是高层次的抽象,体现的是OCP(对修改关闭,对扩展开放)的设计原则,这也是我们设计中一直追求的。

猜你喜欢

转载自blog.csdn.net/weixin_46168350/article/details/111060350