抽象类和接口的区别

接口 (Interface)

特点
  1. 完全抽象:接口中的所有方法都是抽象的(在Java 8之前)。从Java 8开始,接口可以包含默认方法和静态方法。
  2. 方法:接口中的方法默认是publicabstract,不允许有实现(默认方法和静态方法除外)。
  3. 字段:接口中的字段默认是publicstaticfinal的,必须是常量。
  4. 实现:类可以实现多个接口,即Java支持多重继承接口。
  5. 设计意图:接口用于定义类应该遵循的合同或行为,而不关心类的实现。
示例
public interface Animal {
    void eat();
    void sleep();
}

抽象类 (Abstract Class)

特点
  1. 部分抽象:抽象类可以包含抽象方法和具体方法。
  2. 方法:抽象类可以有抽象方法(没有实现)和具体方法(有实现)。
  3. 字段:抽象类可以有实例变量,可以定义非publicnon-staticnon-final字段。
  4. 继承:类只能继承一个抽象类,即Java不支持多重继承类。
  5. 设计意图:抽象类用于表示一种泛化关系,可以提供一些默认的行为或状态。
示例
public abstract class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public abstract void eat();
    
    public void sleep() {
        System.out.println(name + " is sleeping");
    }
}

关键区别

  1. 抽象级别

    • 接口是完全抽象的(在Java 8之前),不包含任何具体实现。
    • 抽象类可以部分抽象,允许包含具体实现。
  2. 字段

    • 接口中只能有publicstaticfinal字段,即常量。
    • 抽象类中可以有任何访问修饰符的实例变量。
  3. 方法

    • 接口中方法默认是publicabstract,Java 8引入了默认方法(default)和静态方法(static)。
    • 抽象类可以包含抽象方法和具体方法,具体方法可以有实现。
  4. 多继承

    • 一个类可以实现多个接口,这实现了多重继承接口。
    • 一个类只能继承一个抽象类。
  5. 构造方法

    • 接口没有构造方法,因为接口不能直接实例化。
    • 抽象类可以有构造方法,虽然不能直接实例化,但子类可以调用其构造方法。
  6. 用途

    • 接口用于定义类应该提供的功能,而不指定功能的实现方式。它更像是一种契约或协议。
    • 抽象类用于提供一个通用的基础结构,可以包含默认行为或状态,子类可以继承和扩展这些行为。

使用场景

  • 接口

    • 当你希望定义一组无关类可以实现的行为时使用接口。
    • 当你需要多重继承时使用接口。
    • 当你希望确保实现类提供特定的行为,但不关心如何实现时使用接口。
  • 抽象类

    • 当你希望在类之间共享代码时使用抽象类。
    • 当你需要为子类提供一些默认行为或状态时使用抽象类。
    • 当你需要控制继承的过程,且不需要多重继承时使用抽象类。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值