• Java中的接口与抽象类:区别与联系


    Java中的接口与抽象类:区别与联系

    在Java中,interface(接口)和abstract class(抽象类)是两种重要的抽象类型,用于定义对象的抽象行为和结构。虽然Java 8之后接口引入了默认方法和静态方法,使得接口功能更加强大,但它们之间仍然存在显著的区别。本文将详细探讨两者的区别及其各自的用途。

    1. 抽象程度和目的

    • 接口 (interface): 用于定义一组方法,这些方法是任何实现接口的类必须要实现的。接口关注的是行为规范。
    • 抽象类 (abstract class): 用于定义一组抽象方法(不带实现)和具体方法(带实现),以及成员变量。抽象类既可以提供部分实现,也可以定义强制子类实现的方法。抽象类关注的是对象的状态和行为。

    2. 方法实现

    • 接口: 接口中的所有方法默认是抽象的(Java 8之前),不能有方法实现。Java 8开始,接口可以包含默认方法(带有默认实现)和静态方法。
    • 抽象类: 抽象类可以包含抽象方法(没有实现)和具体方法(有实现)。

    3. 多重继承

    • 接口: 一个类可以实现多个接口。这种特性使得接口成为实现多重继承的方式。
    • 抽象类: 一个类只能继承一个抽象类。Java不支持多重继承,但允许单继承。

    4. 成员变量

    • 接口: 接口中的成员变量默认是 public static final,即常量,必须在声明时初始化。
    • 抽象类: 抽象类可以包含各种访问级别的成员变量(privateprotectedpublic),且这些变量可以是非静态的,可以在构造器中初始化。

    5. 访问修饰符

    • 接口: 接口的方法默认是 public,不能包含其他访问级别的方法。
    • 抽象类: 抽象类的方法可以有不同的访问修饰符(privateprotectedpublic)。

    6. 构造器

    • 接口: 接口不能有构造器,因为接口不能被实例化。
    • 抽象类: 抽象类可以有构造器,但不能直接实例化。构造器通常用于子类调用,以初始化抽象类的成员变量。

    7. 实现和继承的关键字

    • 接口: 使用 implements 关键字来实现接口。
    • 抽象类: 使用 extends 关键字来继承抽象类。

    示例代码

    接口示例:

    public interface Animal {
        void eat();
        void sleep();
    
        default void breathe() {
            System.out.println("Animal is breathing");
        }
    
        static void describe() {
            System.out.println("This is an animal interface");
        }
    }
    

    抽象类示例:

    public abstract class Dog {
        private String name;
    
        public Dog(String name) {
            this.name = name;
        }
    
        public void sleep() {
            System.out.println(name + " is sleeping");
        }
    
        public abstract void bark();
    
        public void breathe() {
            System.out.println(name + " is breathing");
        }
    }
    

    子类实现:

    public class Labrador extends Dog {
        public Labrador(String name) {
            super(name);
        }
    
        @Override
        public void bark() {
            System.out.println("Labrador is barking");
        }
    }
    

    主要区别

    尽管接口在Java 8之后得到了增强,但接口和抽象类之间仍然存在以下重要区别:

    1. 成员变量

    • 接口: 成员变量默认是 public static final 常量,必须在声明时初始化。
    • 抽象类: 可以包含各种访问级别的成员变量(privateprotectedpublic),可以是非静态的,也可以在构造器中初始化。

    2. 构造器

    • 接口: 接口不能有构造器,不能被实例化。
    • 抽象类: 抽象类可以有构造器,构造器用于子类调用,以初始化抽象类的成员变量。

    3. 多重继承

    • 接口: 一个类可以实现多个接口,提供多重继承的效果。
    • 抽象类: 一个类只能继承一个抽象类,Java 不支持多重继承。

    4. 继承和实现的语义

    • 接口: 强调的是行为规范,定义了一组必须实现的方法。
    • 抽象类: 强调的是代码重用和对象状态,可以包含成员变量和部分实现。

    5. 设计理念和使用场景

    • 接口: 适用于定义某种行为的契约,强调行为的统一性。适合用来定义能力、服务或角色。
    • 抽象类: 适用于需要共享代码的场景,强调代码的重用性和对象的层次结构。适合用来定义具体类的基类。

    使用建议

    1. 使用接口:

      • 当需要定义多个不相关的类可以实现的行为时。
      • 当需要通过多重继承来扩展类的功能时。
      • 当希望实现某种角色或能力的多态性时。
    2. 使用抽象类:

      • 当需要为子类提供一个默认的行为实现时。
      • 当需要在抽象类中定义公共的成员变量和方法时。
      • 当需要利用构造器来初始化一些公共状态时。

    Java中的接口与抽象类:区别与联系

    在Java中,interface(接口)和abstract class(抽象类)是两种重要的抽象类型,用于定义对象的抽象行为和结构。虽然Java 8之后接口引入了默认方法和静态方法,使得接口功能更加强大,但它们之间仍然存在显著的区别。本文将详细探讨两者的区别及其各自的用途。

    1. 抽象程度和目的
    • 接口 (interface): 用于定义一组方法,这些方法是任何实现接口的类必须要实现的。接口关注的是行为规范。
    • 抽象类 (abstract class): 用于定义一组抽象方法(不带实现)和具体方法(带实现),以及成员变量。抽象类既可以提供部分实现,也可以定义强制子类实现的方法。抽象类关注的是对象的状态和行为。
    2. 方法实现
    • 接口: 接口中的所有方法默认是抽象的(Java 8之前),不能有方法实现。Java 8开始,接口可以包含默认方法(带有默认实现)和静态方法。
    • 抽象类: 抽象类可以包含抽象方法(没有实现)和具体方法(有实现)。
    3. 多重继承
    • 接口: 一个类可以实现多个接口。这种特性使得接口成为实现多重继承的方式。
    • 抽象类: 一个类只能继承一个抽象类。Java不支持多重继承,但允许单继承。
    4. 成员变量
    • 接口: 接口中的成员变量默认是 public static final,即常量,必须在声明时初始化。
    • 抽象类: 抽象类可以包含各种访问级别的成员变量(privateprotectedpublic),且这些变量可以是非静态的,可以在构造器中初始化。
    5. 访问修饰符
    • 接口: 接口的方法默认是 public,不能包含其他访问级别的方法。
    • 抽象类: 抽象类的方法可以有不同的访问修饰符(privateprotectedpublic)。
    6. 构造器
    • 接口: 接口不能有构造器,因为接口不能被实例化。
    • 抽象类: 抽象类可以有构造器,但不能直接实例化。构造器通常用于子类调用,以初始化抽象类的成员变量。
    7. 实现和继承的关键字
    • 接口: 使用 implements 关键字来实现接口。
    • 抽象类: 使用 extends 关键字来继承抽象类。
    示例代码

    接口示例:

    public interface Animal {
        void eat();
        void sleep();
    
        default void breathe() {
            System.out.println("Animal is breathing");
        }
    
        static void describe() {
            System.out.println("This is an animal interface");
        }
    }
    

    抽象类示例:

    public abstract class Dog {
        private String name;
    
        public Dog(String name) {
            this.name = name;
        }
    
        public void sleep() {
            System.out.println(name + " is sleeping");
        }
    
        public abstract void bark();
    
        public void breathe() {
            System.out.println(name + " is breathing");
        }
    }
    

    子类实现:

    public class Labrador extends Dog {
        public Labrador(String name) {
            super(name);
        }
    
        @Override
        public void bark() {
            System.out.println("Labrador is barking");
        }
    }
    
    主要区别

    尽管接口在Java 8之后得到了增强,但接口和抽象类之间仍然存在以下重要区别:

    1. 成员变量

    • 接口: 成员变量默认是 public static final 常量,必须在声明时初始化。
    • 抽象类: 可以包含各种访问级别的成员变量(privateprotectedpublic),可以是非静态的,也可以在构造器中初始化。

    2. 构造器

    • 接口: 接口不能有构造器,不能被实例化。
    • 抽象类: 抽象类可以有构造器,构造器用于子类调用,以初始化抽象类的成员变量。

    3. 多重继承

    • 接口: 一个类可以实现多个接口,提供多重继承的效果。
    • 抽象类: 一个类只能继承一个抽象类,Java 不支持多重继承。

    4. 继承和实现的语义

    • 接口: 强调的是行为规范,定义了一组必须实现的方法。
    • 抽象类: 强调的是代码重用和对象状态,可以包含成员变量和部分实现。

    5. 设计理念和使用场景

    • 接口: 适用于定义某种行为的契约,强调行为的统一性。适合用来定义能力、服务或角色。
    • 抽象类: 适用于需要共享代码的场景,强调代码的重用性和对象的层次结构。适合用来定义具体类的基类。

    使用建议

    1. 使用接口:

      • 当需要定义多个不相关的类可以实现的行为时。
      • 当需要通过多重继承来扩展类的功能时。
      • 当希望实现某种角色或能力的多态性时。
    2. 使用抽象类:

      • 当需要为子类提供一个默认的行为实现时。
      • 当需要在抽象类中定义公共的成员变量和方法时。
      • 当需要利用构造器来初始化一些公共状态时。

    参考链接

    1. Java Documentation - Interfaces
    2. Java Documentation - Abstract Classes
    3. Java 8 Features - Default Methods
    4. Java 8 Features - Static Methods in Interfaces

    在这里插入图片描述

  • 相关阅读:
    瞅一瞅JUC提供的限流工具Semaphore
    DODAB纳米脂质体囊泡/PANC-1细胞膜的PEG修饰的脂质体M-PEG-LIP的相关研究与制备
    MySQL操作1——库的的操作(增删查改)
    CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》
    中文语音识别实战(ASR)
    LOGO特训营 第三节 首字母创意手法
    太强了!GitHub上白嫖的SpringCloud微服务进阶宝典,啃完感觉能吊锤面试官!
    数据库系列:大厂使用数据库中间件解决什么问题?
    【精品】pinia 基于插件pinia-plugin-persist的 持久化
    【七】http服务器开发--客户端请求格式和服务器响应格式
  • 原文地址:https://blog.csdn.net/kaka_buka/article/details/139458874