抽象类和接口的比较(重点)

本文探讨了抽象类和接口在定义类行为时的区别。通过狗类的例子,解释了为何在需要添加特殊技能(如钻火圈)时,应该使用接口而不是抽象类。抽象类用于定义基本行为,如eat和sleep,而接口则适合表示额外的、可选的能力,如DrillFireCircle。总结了抽象类的单继承和接口的多实现特性,强调了继承是'是不是'的关系,而接口实现是'有没有'的关系。
摘要由CSDN通过智能技术生成

一张图总结:
在这里插入图片描述
代码举例说明 抽象类和接口

狗都具有 eat() 、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念

//通过抽象类定义
  public abstract class Dog {
      public abstract void eat();
      public abstract void sleep();  
  }
  
  //通过接口定义
  public interface Dog {
      public abstract void eat();
      public abstract void sleep();
  }

但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈DrillFireCircle(),如何增加这个行为呢?

1.将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适(抽象类是单继承的,单继承是指:一个子类只能继承自一个父类,Java 不支持多继承)
2.将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法???)显然也不合适

eat和sleep都是狗本身所应该具有的一种行为, 而钻火圈这种行为则是后天训练出来的,只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内,
所以我们考虑将这个单独的行为,独立的设计一个接口,其中包含DrillFireCircle()方法, Dog设计为一个抽象类, 其中又包括eat() 、sleep() 方法.

如上例:A类继承了B抽象类表示它“是什么”!A类实现了C接口表示它“有什么功能”!
再打个比方:老鹰(具体类)是鸟类(抽象类BirdAbstract或BaseBrid,一般命名Abstract结尾或者Base开头),会飞翔(接口)。老鹰是鸟,不是其他东西了;这类的特性是两个爪子、一对翅膀、空中作业!但可以有多个功能,做很多事,比如会飞(IFly),会吃(IEat)。

//定义接口,含有钻火圈方法
  public interface DrillFireCircle() {
      public abstract void drillFireCircle();
  }
  ​
  //定义抽象类狗类
  public abstract class Dog {
      public abstract void eat();
      public abstract void sleep();
  }
   
  //继承抽象类且实现接口
  class SpecialDog extends Dog implements drillFireCircle {
      public void eat() {
        //....
      }
      public void sleep() {
        //....
      }
      public void drillFireCircle() () {
        //....
      }
  }

如何理解:

1.抽象类可以实现多个接口。
2.接口不能继承抽象类,但允许继承多个接口。
一个接口可以继承多个接口. interface C extends A, B {}是可以的.
一个类可以实现多个接口: class D implements A,B,C{}
一个类只能继承一个类,不能继承多个类 class B extends A{}

总结:
继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。

二者相同点:
接口和抽象类 都不可以实例化
二者不同点:
抽象类是单继承的、接口是多实现的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值