Java 中接口与抽象类的区别

什么是接口

接口是一个可用于实现类的蓝图。该接口不包含任何具体方法(具有代码的方法)。接口的所有方法都是抽象方法。

Java 无法实例化接口。但是,可以实例化实现接口的类。接口永远不包含实例变量,但它们可以包含公共静态最终变量(即常量类变量)

什么是抽象类?

在其声明中具有 abstract 关键字的类称为抽象类。抽象类应该至少有一个抽象方法,即没有具体实现的方法。它可以有多种具体方法。

抽象类允许你为具体类创建蓝图。但是继承类应该实现抽象方法。抽象类无法实例化。

使用接口的重要原因

  • 接口用于实现抽象。
  • 旨在支持运行时的动态方法解析
  • 它可以帮助你实现松耦合。
  • 允许你将方法的定义与继承层次结构分开

使用抽象类的重要原因

  • 抽象类为子类提供默认功能。
  • 为将来的特定类提供模板
  • 帮助你为其子类定义公共接口
  • 抽象类允许代码可重用性。

接口与抽象类

参数 接口 抽象类
速度
多重继承 实现几个接口 只有一个抽象类
结构 抽象方法 摘要和具体方法
何时使用 未来的增强 为了避免独立
继承/实施 一个 Class 可以实现多个接口 该类只能继承一个抽象类
默认实施 在向界面添加新内容时,找到所有实现者并实现新定义的东西是一场噩梦。 对于 Abstract Class,你可以利用默认实现。
访问修饰符 该接口没有访问修饰符。界面内定义的所有内容都假定为 public 修饰符。 Abstract 类可以有一个访问修饰符。
何时使用 当各种实现仅共享方法签名时,最好使用接口。值类型的多态层次结构。 当相同类型的各种实现共享共同行为时,应该使用它。
数据字段 该接口不能包含数据字段。 该类可以有数据字段。
多重继承默认值 一个类可以实现许多接口。 一个类只继承一个抽象类。
实施 接口是抽象的,因此无法提供任何代码。 抽象类可以提供应该被覆盖的完整的默认代码。
使用 Access 修饰符 你不能对方法,属性等使用访问修饰符 你可以使用包含访问修饰符的抽象类。
用法 接口有助于定义类的外围功能。 抽象类定义类的标识。
定义的字段 没有字段可以定义 抽象类允许你定义字段和常量
继承 接口可以继承多个接口但不能继承类。 抽象类可以继承一个类和多个接口。
构造函数或析构函数 接口不能声明构造函数或析构函数。 抽象类可以声明构造函数和析构函数。
扩展限制 它可以扩展任意数量的接口。 它一次只能扩展一个类或一个抽象类。
抽象关键字 在抽象接口关键字中,可以选择将方法声明为抽象。 在抽象类中,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 " + (obj.b * obj.b));
    }
}