接口和抽象类的区别是什么?通过代码示例讲解

接口和抽象类在Java中扮演不同角色:抽象类用于代码复用,接口则约束类的行为。狗的例子展示了如何根据行为本质(eat/sleep)和附加技能(钻火圈)来区分抽象类和接口的使用。接口在JDK8后增加了默认方法和静态方法,允许更加灵活的设计。在设计时,关注"是不是"关系时用继承,"有没有"关系时用接口实现。
摘要由CSDN通过智能技术生成

接口和抽象类的区别

  • 抽象类可以存在普通成员函数,而接口中只能存在public abstract方法。

  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的(jdk1.8默认就有)

  • 抽象类只能继承一个,接口可以实现多个

  • 接口方法默认修饰符是 public ,抽象方法可以有 public 、 protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。

  • 从设计层⾯来说,接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有 什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。

    而抽象类的设计目的,是代码复用

使用场景:

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

总结一下 jdk7~jdk9 Java 中接口概念的变化

  1. 在 jdk 7 或更早版本中,接口⾥⾯只能有常量变量抽象方法。这些接口方法必须由选择实现接口的类实现。
  2. jdk 8 的时候接口可以有默认方法静态方法功能。
  3. Jdk 9 在接口中引入了私有方法和私有静态方法

我们从我们实际设计场景中来切入这个话题

先来举一个简单的例子:

狗都具有 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. 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适
  2. 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适

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



一个SpecialDog即可继承Dog类并且实现DrillFireCircle()接口



下面给出代码:

  //定义接口,含有钻火圈方法
  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() () {
        //....
      }
  }

总结:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值