【学习笔记】接口 vs 抽象类:一篇讲清「继承」与「扩展」的底层逻辑,新手也能秒懂

Ice-jay 2026-07-13 22:56 1

Java接口的官方定义


An interface declares a set of abstract methods (and, in Java SE 8 and later, default methods and static methods) that can be implemented by classes. It is a reference type, similar to a class, but it cannot be instantiated. A class that implements an interface must implement all the abstract methods declared in the interface, unless the class is abstract.



  • 翻译过来就是: 接口是一种引用类型,它声明了一组抽象方法(不包括方法体的方法),定义了一个类或多个类必须遵循的行为规范。接口本身不包含方法的具体实现(默认方法和静态方法除外),而是由实现接口的类来提供这些方法的具体逻辑。


接口的理解



  • 首先我们要知道Java是单继承的,而非多继承。这样就意味着如果多个子类有共同的方法,只有部分子类是没有这个共同的方法的,那么我们就不能将这个方法写到父类中,而需要写在子类中作为特有的方法,最终导致不能抽象出统一的方法名,从而方法命名混乱、代码无法通用、扩展维护成本极高。就比如:一个飞行的方法,鹦鹉、蜻蜓都有这个方法,只是方法体不同,如:鹦鹉是快速的飞行,蜻蜓是缓慢的飞行。但是狗没有这个方法,那么Animal这个父类中是无法定义这个方法的,而是要抽象到各自的子类中。如果有了接口,那么我们就可以将飞行这个方法放到接口中,谁需要谁就实现这个接口即可。我们也可以将他理解为继承了另一个父类

  • 如果理解还有困难,我们不妨反过来想。如果没有接口的话,我们只能在子类中定义这个方法。这个方法的方法体是不同的。要是能够将这些方法再抽象出来变成一个方法名,这样就实现了统一(这个就是接口的核心作用),只需要重写方法体即可,那么接口就是用来干这个的。它集成了多个方法(必须是抽象方法,因为他没有具体实现),其他的子类可以实现它,并重写,那么的子类的相同方法的方法名就能够统一了


定义接口语法


接口是没有具体实现的,它是一种规则



public interface Swim {

public abstract void swim();
public abstract void fly();
}


实现接口


接口的实现要重写,因为接口是没有具体的方法体的


public class Dog extends Animal implements Swim{
public Dog() {}
public Dog(String name,int age) {
super(name, age);
}
@Override
public void swim() {
System.out.println("狗在游泳");
}
}


注意点


接口和类的实现关系,可以单实现,也可以多实现







      • public class 类名 implements接口名1,接口名2{}






实现类还可以在继承一个类的同时实现多个接口







      • public class 类名 extends 父类implements 接口名1,接口名2{}






抽象方法和抽象类


为什么存在抽象类和抽象方法(理解本质)?




  • 我们将子类的共同方法抽象到父类中,但是这些方法的方法体是不同的。因此父类是没法写这个方法体的。那么没有方法体的方法就叫抽象方法。他所在的类就叫做抽象类




  • 总结:父类无法确定方法体,用抽象方法,这个父类叫做抽象类




抽象类和抽象类的的定义格式


抽象方法定义格式


抽象类定义格式


抽象类和抽象方法的注意事项:



  • 抽象类不能实例化

  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类

  • 可以有构造方法



    • 构造方法的作用:

      • 创建实例并初始化

      • 子类通过调用super()给子类的共有属性赋值

      • 所以说:他不能创建实例,那么作用就是:子类通过调用super()给子类的共有属性赋值





  • 抽象类的子类



    • 重写抽象类中的所有抽象方法




接口和抽象方法的区别(言简意赅,直击本质)



  • 共性:

    • 他们主要作用都是强制规范方法的统一。



  • 区别:抽象方法是继承的,它是单继承。而接口是扩展的,类似于多继承,它主要是扩展

    • 接口不是共性的,比较灵活,它是扩展。而抽象方法是共性的规范,是继承




对接口和抽象方法的区别的补充



  • 抽象类的 “共性” 不仅是方法,还包括属性和实现抽象类的 “共性” 除了抽象方法的规范,还可能包含共享的属性和已经实现的普通方法,是 “属性 + 方法 + 规范” 的整体复用。而接口的 “规范” 更纯粹,即使有默认方法,也更多是为了 “扩展能力” 而非 “共享共性实现”。

  • 接口的 “灵活扩展” 解决了 Java 单继承的局限性比如一个类既需要继承 Employee(员工)这个抽象类(体现 “是员工” 的本质),又需要拥有 Serializable(可序列化)和 Comparable(可比较)的能力,这时只能通过实现多个接口来实现 —— 这正是接口 “多实现” 的核心价值:在不破坏单继承逻辑的前提下,给类附加多种无关的能力。












































维度 抽象类 接口
本质关系 is-a(是一种) can-do / has-a(具备某种能力)
设计关键词 继承、共性复用 扩展、能力规范
继承/实现 单继承:一个类只能继承一个抽象类 多实现:一个类可实现多个接口
主要内容 属性 + 普通方法 + 抽象方法 + 构造方法等 抽象方法、默认方法、静态方法;字段默认是 public static final 常量
侧重点 同一族类的「共同身份 + 共享实现」 跨类别的「统一能力契约」
灵活性 相对固定,强调继承树 更灵活,可自由组合能力

最新回复 (2)
  • Guerra Poos 07-13 23:43
    5

    虽然基础知识挺重要,但现在ai这么智能,没几个人能沉下心来学这个了

  • 深念 07-13 23:49
    6

    哈哈 ,现在不喜欢用继承,特别是AI用多了以后,感觉AI喜欢扁平化的结构

* 帖子来源Linux.do
返回