江离书生

vuePress-theme-reco 史博辉    2024
江离书生 江离书生

Choose mode

  • dark
  • auto
  • light
主页
分类
  • html
  • java
  • 日常生活
  • markdown
  • mysql
  • nvm
  • pnpm
  • 常见问题
  • vue3
标签
时间轴
author-avatar

史博辉

51

文章

9

标签

主页
分类
  • html
  • java
  • 日常生活
  • markdown
  • mysql
  • nvm
  • pnpm
  • 常见问题
  • vue3
标签
时间轴
  • Java

    • Java 面试题

      • Arraylist 和 LinkedList 的区别
      • 什么是动态数组
      • Java 类的加载过程
      • List、Set 和 Map 的区别?
      • HashMap 的实现原理
      • 什么是线程安全
      • java 中接口和抽象类的区别

java 中接口和抽象类的区别

vuePress-theme-reco 史博辉    2024

java 中接口和抽象类的区别

史博辉 2024-06-24 23:28:00 java

在Java中,接口(interface)和抽象类(abstract class)都是用于定义类的行为和结构的高级概念。它们都不能直接实例化,但它们在功能和使用方式上有一些关键的区别和特性。

# 接口(Interface)

  1. 定义

接口是抽象类型的一种,它只能包含常量、方法签名、默认方法、静态方法和嵌套类型。接口中的方法默认是抽象的(即没有方法体),并且默认是 public。

  1. 特点
  • 方法:接口中的所有方法默认是 public 和 abstract。从 Java 8 开始,接口可以包含默认方法(有方法体)和静态方法。
  • 变量:接口中的变量默认是 public、static 和 final,即常量。
  • 多重继承:一个类可以实现多个接口,从而实现多重继承。
  • 抽象性:接口无法包含任何实现细节,所有方法都是抽象的,除非是默认方法或静态方法。
  • 默认方法:从 Java 8 开始,接口可以包含带有方法体的默认方法,使用 default 关键字定义。
  • 静态方法:从 Java 8 开始,接口可以包含静态方法。
  1. 示例
public interface Animal {
    void eat();
    void sleep();

    default void run() {
        System.out.println("Running...");
    }

    static void info() {
        System.out.println("This is an animal interface");
    }
}

# 抽象类(Abstract Class)

  1. 定义

抽象类是不能实例化的类,它可以包含抽象方法(没有方法体)和具体方法(有方法体)。抽象类用 abstract 关键字声明。

  1. 特点
  • 方法:抽象类可以包含抽象方法(没有方法体)和具体方法(有方法体)。抽象方法必须由子类实现。
  • 变量:抽象类中可以有实例变量。
  • 构造函数:抽象类可以有构造函数,但不能被实例化,只能被子类调用。
  • 继承:一个类只能继承一个抽象类,但可以实现多个接口。
  • 访问修饰符:抽象类中的方法可以有各种访问修饰符(public、protected、private)。
  1. 示例
public abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void eat();
    public abstract void sleep();

    public void run() {
        System.out.println("Running...");
    }

    public String getName() {
        return name;
    }
}

# 接口和抽象类的比较

  • 抽象层次:接口更抽象,只定义方法签名,不提供任何实现。而抽象类可以提供部分实现。
  • 多重继承:Java中,一个类可以实现多个接口,但只能继承一个抽象类。
  • 成员变量:接口中只能有静态常量(public static final),而抽象类可以有实例变量。
  • 方法实现:接口中只有默认方法和静态方法可以有实现,而抽象类中的具体方法可以有实现。
  • 用途:接口用于定义一种能力(比如 Runnable 表示可运行的),而抽象类用于定义一种类型(比如 Animal 表示动物)。

# 何时使用接口和抽象类

  • 接口:当你希望定义某种行为,并且不同类可以实现这种行为时,使用接口。例如,Comparable 接口定义了对象之间可以比较的行为,任何类都可以实现这个接口来定义自己的比较逻辑。
  • 抽象类:当你希望定义一组相似的对象并共享一些代码时,使用抽象类。例如,Animal 抽象类可以定义所有动物共有的属性和行为,并让具体的动物类(如Dog、Cat)继承并实现特定的行为。

示例使用

public interface Flyable {
    void fly();
}

public abstract class Bird {
    private String name;

    public Bird(String name) {
        this.name = name;
    }

    public abstract void eat();
    public abstract void sleep();

    public void run() {
        System.out.println("Running...");
    }

    public String getName() {
        return name;
    }
}

public class Sparrow extends Bird implements Flyable {
    public Sparrow(String name) {
        super(name);
    }

    @Override
    public void eat() {
        System.out.println("Sparrow is eating");
    }

    @Override
    public void sleep() {
        System.out.println("Sparrow is sleeping");
    }

    @Override
    public void fly() {
        System.out.println("Sparrow is flying");
    }
}

在上面的示例中,Sparrow 类继承了 Bird 抽象类并实现了 Flyable 接口。Bird 类定义了所有鸟类共有的行为和属性,而 Flyable 接口定义了飞行行为。Sparrow 类具体实现了这些抽象方法和接口方法。