接口 vs 抽象类:一篇讲清 “继承” 与 “扩展” 的底层逻辑,新手也能秒懂

IT疑难杂症诊疗室 10w+人浏览 659人参与

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{}

抽象方法和抽象类

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

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

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

  • 抽象方法定义格式

  • 抽象类定义格式

public abstract class 类名

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

  • 抽象类不能实例化
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类
  • 可以有构造方法
    • 构造方法的作用:
      • 创建实例并初始化
      • 子类通过调用super()给子类的共有属性赋值
      • 所以说:他不能创建实例,那么作用就是:子类通过调用super()给子类的共有属性赋值
  • 抽象类的子类
    • 重写抽象类中的所有抽象方法

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

  • 共性:
    • 他们主要作用都是强制规范方法的统一。
  • 区别:抽象方法是继承的,它是单继承。而接口是扩展的,类似于多继承,它主要是扩展
    • 接口不是共性的,比较灵活,它是扩展。而抽象方法是共性的规范,是继承

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

  • 抽象类的 “共性” 不仅是方法,还包括属性和实现抽象类的 “共性” 除了抽象方法的规范,还可能包含共享的属性和已经实现的普通方法,是 “属性 + 方法 + 规范” 的整体复用。而接口的 “规范” 更纯粹,即使有默认方法,也更多是为了 “扩展能力” 而非 “共享共性实现”。
  • 接口的 “灵活扩展” 解决了 Java 单继承的局限性比如一个类既需要继承 Employee(员工)这个抽象类(体现 “是员工” 的本质),又需要拥有 Serializable(可序列化)和 Comparable(可比较)的能力,这时只能通过实现多个接口来实现 —— 这正是接口 “多实现” 的核心价值:在不破坏单继承逻辑的前提下,给类附加多种无关的能力。
维度抽象类接口
本质体现 “is-a” 关系(继承,如 “狗是动物”)体现 “has-a” 关系(扩展,如 “狗有游泳能力”)
继承 / 实现单继承(子类只能继承一个抽象类)多实现(类可以实现多个接口)
内容可包含普通方法(有实现)、抽象方法、各种权限的属性只能包含抽象方法、默认方法、静态方法,属性默认是常量
设计意图复用共性代码(属性 + 普通方法)+ 规范子类行为统一不同类的能力规范,实现跨类别的功能扩展
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值