Interface 和 Abstract Class 的区别

本文介绍了OO中Interface和Abstract Class的概念。Abstract Class类似抽象数据类型,定义子类特性,可扩展;Interface定义协议,实现它的需保证行为一致。还阐述了Java平台里二者的三个不同点,如类只能继承一个超类但可实现多个Interface等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Interface:接口
Abstract Class:抽象类
Class:类,包括抽象类。
学 Java 的人,或学 OO 编程的人,都是要弄清楚这两个概念的区别。
现将我的观点说一下。

在OO中,Interface 和Abstract Class 是两个不同的概念。

1。Abstract Class类似于 Abstract Data Type(抽象数据类型),它定义了它所有的subclass(子类)应该有的特性,就是在Abstract Class 中声明方法和变量。如定义一种抽象类型:车。那么在Java中,就要在class或method上加上 abstract。举个例:

public abstract class 车
{
  public int 轮子;
  public abstract void 移动();
}
这个抽象类就声明了所有的车应有的特征(如轮子)和行为(如移动)。之后你就可以扩展(extend)这个抽象类,只要是车,就可以,还有你可以在子类(subclass)中加入自己的特征,如
 public class 跑车 extends 车
 {
  public void 移动()
  {
    System.out.println("我在移动");
  }  
  public void 引擎类型()  //属于自己(跑车)的行为
  {
    System.out.println("高级引擎");
  }
  轮子=4;
 }

 public class 自行车 extends 车
 {
  public void 移动()
  {
    System.out.println("我在移动");
  }  
  public void 爆胎()  //属于自己(自行车)的行为
  {
    System.out.println("我走不动了");
  }
  轮子=2;
 }

2。Interface 则用来定义一个协议,所有的方法都可以实现它。一个Interface定义了方法,和最终静态(final static)变量,所有实现这个Interface的都要保证实现的东西与这个Interface 定义的行为一致。使用Interface可以让Object(对象)在一定的规范下沟通。


public interface TCP协议
{
 public void 打开端口();
 public void 关闭端口();
}
这样的话,只要实现这个Interface的都可以使用这两个方法交流。


在 Java平台里,它们主要有3个不同点:
1。一个类(Class)只能继承一个超类(Super class),但是可以实现多个Interface。
2。在Abstract Class内,你可以有不抽象(Abstract)的方法,即有意义的方法,但Interface不行。
 如
 public abstract class 车
 {
  public int 轮子;
  public abstract void 移动();
  public String 我是什么()
  {
    return "车子";
  }
 }
3。Interface不属于 继承范围。即不可能成为超类(Super Class)
(完)

这篇文章是根据Sun的FAQ中http://access1.sun.com/FAQSets/newtojavatechfaq.html 的Q13
翻译得来

<think>好的,用户想了解接口(interface抽象类(abstract class)在编程中的区别。首先,我需要回忆一下这两者的基本概念它们在面向对象编程中的作用。根据引用[1],抽象类的子类必须实现父类中的所有抽象方法,否则子类也必须声明为抽象类。而接口不能实例化,可以包含有实现或无实现的方法,所有字段默认是public、static、final的,方法默认是public的。引用[2]提到接口不能有状态或实现,数据成员必须是publicfinalstatic的,而抽象类可以有状态方法实现。另外,接口支持多重继承,而抽象类不行。引用[3]则提到设计上的区别,抽象类适用于IS-A关系,接口适用于CAN-DO-THIS关系。例如,形状类适合用抽象类,而可飞行适合用接口。接下来要整理这些区别,分点说明。可能需要从定义、继承、方法实现、状态、设计目的等方面展开。同时要注意用户可能对Java比较熟悉,因为引用中多次提到Java的例子。需要确保术语准确,比如接口的默认方法、静态方法等特性。还要考虑用户可能的实际应用场景,比如什么时候选择抽象类,什么时候用接口。引用[4]提到抽象类用于定义特定行为的结构,而接口用于契约式编程。引用[5]提到抽象类的子类需要实现所有抽象方法,而接口的方法都是抽象的。 需要检查是否有遗漏点,比如构造函数的区别,接口的多重继承,以及Java8之后接口可以有默认方法等。这些内容在引用中没有详细提到,可能需要补充,但要根据现有引用内容,避免引入外部知识。最后,生成相关问题时要围绕两者的区别应用,比如适用场景、多重继承、设计原则等。确保问题能帮助用户进一步理解。</think>### 接口(interface)与抽象类(abstract class)的区别 接口抽象类是面向对象编程中实现多态代码复用的两种重要机制,以下是它们的核心区别: #### 1. **定义与核心目的** - **抽象类**: - 用于定义**IS-A(是一个)**关系,例如:`Circle`是`Shape`的一种[^3]。 - 可以包含**具体方法**(有实现)**抽象方法**(无实现),还能定义字段(数据成员)构造方法[^2][^4]。 - 子类必须实现所有抽象方法,否则子类自身也必须声明为抽象类[^1]。 - **接口**: - 用于定义**CAN-DO-THIS(能做某事)**关系,例如:`Bird`可以实现`Flyable`接口[^3]。 - 所有方法默认是`public abstract`的(Java 8后允许`default``static`方法),字段默认是`public static final`的[^1][^2]。 - 接口不包含构造方法,也不能保存对象状态(即非静态字段)[^2]。 #### 2. **继承与实现** - **抽象类**: - 支持**单继承**,一个类只能继承一个抽象类。 - 子类通过`extends`关键字继承。 - **接口**: - 支持**多重继承**,一个类可以实现多个接口[^2]。 - 通过`implements`关键字实现接口。 #### 3. **代码复用与设计** - **抽象类**适合: - 多个子类共享**公共代码逻辑**(通过具体方法实现)[^4]。 - 需要定义**部分默认行为**的场景,例如模板方法模式。 - **接口**适合: - 定义**行为契约**,强制实现类遵循特定规范(如`Comparable`接口)[^4]。 - 解耦功能扩展,例如通过接口组合实现灵活的功能叠加[^3]。 #### 4. **典型应用场景** - **抽象类示例**: ```java abstract class Shape { abstract double area(); // 抽象方法 void print() { // 具体方法 System.out.println("Area: " + area()); } } ``` - **接口示例**: ```java interface Flyable { void fly(); // 隐式抽象方法 } ``` #### 5. **版本演进的影响** - 在Java 8之后,接口可以通过`default`方法提供默认实现,但仍不能保存状态[^1]。 - 抽象类的演进可能破坏子类兼容性(如新增抽象方法),而接口通过`default`方法可避免这一问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值