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));
}
}