Java 抽象类与接口的区别

Java 中接口与抽象类的主要区别

  • 在接口中,一个类可以实现多个接口,而一个类只能继承一个抽象类。
  • 接口没有访问修饰符。接口中定义的所有内容都假定为 public 修饰符,而抽象类可以具有访问修饰符。
  • 接口不能包含数据字段,而抽象类可以包含数据字段。
  • 接口有助于定义类的外部能力,而抽象类定义类的身份。

Interface vs Abstract Class in Java

什么是抽象类?

声明中带有 abstract 关键字的类称为抽象类。抽象类应该有零个或多个抽象方法。即没有方法体的函数。它可以有多个具体方法。抽象类允许您创建具体类的蓝图。但继承的类应实现抽象方法。抽象类不能实例化。

使用接口的重要原因

  • 接口用于实现数据抽象
  • 旨在支持运行时动态方法解析
  • 它有助于实现松耦合。
  • 允许您将方法定义与继承层次结构分离

使用抽象类的重要原因

  • 抽象类为子类提供默认功能。
  • 为未来的特定类提供模板
  • 有助于为子类定义通用接口
  • 抽象类允许代码重用。

什么是接口?

接口是类实现的蓝图。接口不包含任何具体方法(有代码的方法)。接口的所有方法都是抽象方法。接口不能实例化。但是,实现接口的类可以实例化。接口不包含实例变量,但可以包含 public static final 变量(即常量类变量)。

Java 中接口与抽象类的区别

抽象类允许您创建子类可以实现或重写的方法,而接口只允许您声明方法但不能实现它。一个类只能继承一个抽象类,而一个类可以实现多个接口。

参数 接口 抽象类
速度
多重继承 实现多个接口 只有一个抽象类
结构体 抽象方法 抽象方法和具体方法
何时使用 未来增强 避免独立性
继承/实现 类可以实现多个接口 类只能继承一个抽象类
默认实现 在接口中添加新内容时,找到所有实现者并实现新定义的内容是一场噩梦。 在抽象类的情况下,您可以利用默认实现。
访问修饰符 接口没有访问修饰符。接口中定义的所有内容都被假定为 public 修饰符。 抽象类可以有访问修饰符。
何时使用 当多个实现仅共享方法签名时,最好使用接口。值类型的多态层次结构。 当同一类型的多个实现共享通用行为时,应使用它。
数据字段 接口不能包含数据字段。 类可以有数据字段。
多重继承默认 一个类可以实现多个接口。 一个类只继承一个抽象类。
实施 接口是抽象的,因此它不能提供任何代码。 抽象类可以提供完整的默认代码,这些代码应该被重写。
使用访问修饰符 您不能为方法、属性等使用访问修饰符。 您可以使用包含访问修饰符的抽象类。
用途 接口有助于定义类的外部能力。 抽象类定义类的身份。
定义的字段 不能定义字段 抽象类允许您定义字段和常量
继承 接口可以继承多个接口,但不能继承类。 抽象类可以继承类和多个接口。
构造函数或析构函数 接口不能声明构造函数或析构函数。 抽象类可以声明构造函数和析构函数。
扩展限制 它可以继承任意数量的接口。 它一次只能继承一个类或一个抽象类。
抽象关键字 在抽象接口关键字中,声明方法为抽象是可选的。 在抽象类中,声明方法为抽象是必需的 abstract 关键字。
类类型 接口只能有 public abstract 方法。 抽象类具有 protected 和 public abstract 方法。

Java 中接口和抽象类的示例代码

以下是创建 Java 接口和抽象类的示例代码

接口语法

interface name{
//methods
}

Java 接口示例

interface Pet {
    public void test();
}
class Dog implements Pet {
    public void test() {
        System.out.println("Interface Method Implemented");
    }
    public static void main(String args[]) {
        Pet p = new Dog();
        p.test();
    }
}

抽象类语法

abstract class name{
    // code
}

抽象类示例

abstract class Shape {
    int b = 20;
    abstract public void calculateArea();
}

public class Rectangle extends Shape {
    public static void main(String args[]) {
        Rectangle obj = new Rectangle();
        obj.b = 200;
        obj.calculateArea();
    }
    public void calculateArea() {
        System.out.println("Area is " + (b * b));
    }
}