接口和抽象类的区别是什么?

本文详细阐述了抽象类与接口之间的区别,包括它们的设计理念、使用方式及限制条件等。介绍了抽象类作为模板设计,而接口则作为一种行为规范。此外还讲解了抽象方法、非抽象方法、final变量等方面的不同。

  从设计层面讲,抽象是类的抽象,是一种模版设计,接口是行为抽象,是一种行为规范。

 

  • 抽象类可以存在抽象方法和非抽象方法,接口只能存在抽象方法。
  • 类只可以继承一个抽象类,但是可以实现多个接口。
  • 抽象类声明的变量可以是非final的,接口声明的变量默认为final的。
  • 抽象类的成员函数可以为public、protected、private的,接口的成员函数只能是public。
  • 类可以不实现抽象类和接口的所有方法,则这个类必须声明成抽象的。
  • 抽象类可以在不提供接口方法的情况下实现接口。
  • 抽象类不能被实例化,但是如果它包含main方法的话是可以被调用的,接口是绝对抽象的,不能被实例化。

 

转载于:https://www.cnblogs.com/Freak-Lew/p/9193046.html

在 Java 中,接口抽象类是两种不同的面向对象编程机制,各自适用于不同的设计需求场景。 ### 定义与组成 抽象类是一种特殊的类,可以包含抽象方法(没有实现的方法)具体方法(有实现的方法)。它可以拥有构造函数、成员变量,并且可以定义访问修饰符为 `private`、`protected`、`public` 的方法。接口是一种行为规范,通常用于定义方法的签名,而具体的实现由实现接口的类完成。在 JDK 8 及以上版本中,接口可以包含 `default` `static` 方法[^4]。 ### 使用场景 抽象类适合表示“is-a”关系,即子类与父类在概念上是一致的。例如,猫狗都可以继承一个动物类抽象类,因为它们本质上是动物。接口则适用于“can-do”关系,即实现者并不需要在概念上一致,只需要实现接口定义的行为。例如,鸟飞机可以实现一个 `Fly` 接口,因为它们都具备“飞”的行为,但它们并不需要共享一个共同的父类[^3]。 ### 实现与继承 Java 中的类只能继承一个抽象类,但可以实现多个接口。这种多重实现的特性使接口在需要组合多个行为时具有更大的灵活性。抽象类可以提供部分实现,而接口则更偏向于完全的抽象定义[^1]。 ### 扩展性 接口具有更高的扩展性,因为可以通过添加默认方法来向后兼容地扩展接口的功能。而修改抽象类可能会对所有子类产生影响,因此在扩展抽象类时需要更加谨慎[^2]。 ### 访问修饰符 抽象类可以使用 `private`、`protected`、`public` 等多种访问修饰符,而接口中的方法默认是 `public`,并且不能使用 `private` 修饰符。在 JDK 9 及以上版本中,接口支持 `private` 方法,但仅限于静态或默认方法中使用。 ### 性能 由于接口的实现需要通过动态绑定,而抽象类的调用可以直接通过继承链进行,因此抽象类在性能上略优于接口[^2]。 ### 构造方法 抽象类可以有构造方法,用于初始化抽象类中的成员变量。而接口不能有构造方法,因为它不能直接实例化。 ### main 方法 抽象类可以包含 `main` 方法,因此可以直接运行。而接口不能直接运行,尽管它可以包含 `main` 方法(从 JDK 8 开始),但这通常不推荐使用[^2]。 ### 设计模式 抽象类通常用于模板方法模式,其中定义了一个算法的骨架,而具体步骤由子类实现。接口则常用于策略模式、观察者模式等,用于定义一组行为规范[^2]。 ### 示例代码 下面是一个抽象类的示例: ```java abstract class Animal { abstract void makeSound(); void sleep() { System.out.println("Sleeping..."); } } class Dog extends Animal { void makeSound() { System.out.println("Barking..."); } } ``` 下面是一个接口的示例: ```java interface Flyable { void fly(); default void landing() { System.out.println("Landing..."); } } class Bird implements Flyable { public void fly() { System.out.println("Bird is flying..."); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值