接口和抽象类的区别


本文基于jdk1.8谈论接口和抽象类的区别

1.抽象类

1.1抽象类的定义

抽象类通常包含抽象方法、非抽象方法和属性。子类要么实现这些抽象方法,要么也声明为抽象类。非抽象方法和属性可以有具体的实现代码,并且可以被子类继承,根据需要进行覆盖和修改。由于抽象方法的存在,抽象类是一个不能被实例化的类,只能被用作其他类的父类。

public abstract class AbstractExample {
    // 定义普通变量
    int count = 2;
    // 定义私有变量
    private static int total = 10;
    // 定义抽象方法
    public abstract void methodA();
    // 定义普通方法
    public void methodB() {
        System.out.println("Hi,methodB.");
    }
}

2.接口

1.2接口的定义

接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在 JDK 8 之后,接口中可以创建 static 和 default 方法了,并且这两种方法可以有默认的方法实现。

public interface Interface_1 {
    int count = 1;
    void sayHi();
    // default 方法
    default void print() {
        System.out.println("Do print method.");
    }
    // static 方法
    static void smethod() {
        System.out.println("Do static method.");
    }
}

3.区别

  1. 定义方式:
    • 抽象类:使用abstract关键字定义。
    • 接口:使用interface关键字定义。
  2. 实现:
    • 抽象类:可以部分实现(即包含抽象方法和非抽象方法)。
    • 接口:在Java 8之前只能定义抽象方法,从Java 8开始可以包含默认方法(有默认实现的方法)和静态方法。
  3. 成员变量:
    • 抽象类:成员变量可以是各种类型,包括实例变量和类变量。
    • 接口:在Java 8之前只能定义公共的静态的最终变量(public static final),从Java 8开始可以定义实例变量(默认是public static final)。
  4. 构造函数:
    • 抽象类:可以有构造函数。
    • 接口:不能有构造函数。
  5. 访问修饰符:
    • 抽象类:除抽象方法不能用private修饰外,可以有各种访问修饰符。
    • 接口:除了静态方法和默认方法外,其余的都是public的。属性默认是public static final修饰的
  6. 使用场景:
    • 抽象类:当你想要共享代码的时候,并且有明确的类层次结构时,可以使用抽象类。
    • 接口:当你在定义职责而不是共享代码时,可以使用接口,或者当你想要实现多重继承时。
  7. 实现方式:
    • 抽象类:使用extends关键字实现。
    • 接口:使用implements关键字实现。
  8. 方法实现:
    • 抽象类:子类可以不实现抽象类中的所有抽象方法(除非子类也是抽象类)。
    • 接口:实现接口的类必须实现接口中的所有方法(Java 8之前),或者使用default关键字提供默认实现。

文章作者: Fuchanglai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fuchanglai !
赏
  目录