Java 抽象类与接口的区别
Java 中接口与抽象类的主要区别
- 在接口中,一个类可以实现多个接口,而一个类只能继承一个抽象类。
- 接口没有访问修饰符。接口中定义的所有内容都假定为 public 修饰符,而抽象类可以具有访问修饰符。
- 接口不能包含数据字段,而抽象类可以包含数据字段。
- 接口有助于定义类的外部能力,而抽象类定义类的身份。
什么是抽象类?
声明中带有 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)); } }