题目
什么是抽象类?什么是接口?抽象类和接口的适用场景分别是什么?
答案
@[toc]
---
## 什么是抽象类?(abstract)
**包含一个或多个抽象方法的类就是抽象类,抽象方法即没有方法体的方法**,抽象方法和抽象类都必须声明为 `abstract`。例如:
```java
// 抽象类
public abstract class Person {
// 抽象方法
public abstract String getDescription();
}
```
切记!**除了抽象方法之外,抽象类还可以包含具体数据和具体方法**。例如, 抽象类 `Person ` 还保存着姓名和一个返回姓名的具体方法:
```java
public abstract class Person{
private String name;
public Person(String name){
this.name = name ;
}
public abstract String getDescription();
public String getName(){
return name;
}
}
```
> 许多程序员都会**错误**的认为,在抽象类中不能包含具体方法。其实这也是接口和抽象类的不同之处,接口中是不能包含具体方法的。
**抽象类不能被实例化**。也就是说,如果将一个类声明为 `abstract`, 就不能创建这个类的对象。
可以定义一个抽象类的对象变量, 但是它**只能引用非抽象子类的对象**。 假设 `Student` 类是 `Person` 的非抽象子类:
```java
Person p = new Student("Jack"); // Right
```
所谓非抽象子类就是说,如果创建一个继承抽象类的子类并为之创建对象,那么就**必须为父类的所有抽象方法提供方法定义**。如果不这么做(可以选择不做),子类仍然是一个抽象类,编译器会强制我们为新类加上 `abstract` 关键字,仍然不能实例化。
---
总结:抽象类(Abstract Class)是一种特殊的类,它不能被实例化,只能作为其他类的父类来使用。抽象类中可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。如果一个类继承了抽象类,则必须实现该抽象类中所有的抽象方法,否则该子类也必须声明为抽象类。抽象类的主要作用是为子类提供通用的方法实现,同时强制子类必须实现某些方法以保证其正确性。
**抽象类的适用场景**是当多个子类具有共同的方法实现时,可以将这些共同的方法实现放在抽象类中,由子类继承并扩展各自的方法,**模板方法模式**就是抽象类的一个典型应用。此外,抽象类也可以用来限制实例化,只有子类可以被实例化,从而增强程序的安全性。
## 什么是接口?(interface)
接口的本质其实也是一个类,而且是一个比抽象类还要抽象的类。怎么说呢?抽象类是能够包含具体方法的,而接口杜绝了这个可能性,**在 Java 8 之前,接口非常纯粹,只能包含抽象方法,也就是没有方法体的方法**。而 Java 8 中接口出现了些许的变化,开始允许接口包含默认方法和静态方法
Java 使用关键字 `interface` 而不是 `class` 来创建接口
```java
public interface Concept {
void idea1();
void idea2();
}
```
同样的,接口中既然存在抽象方法,那么他就需要被扩展(继承)。使用 `implements` 关键字使一个类扩展某个特定接口(或一组接口),通俗来说:接口只是外形,现在这个扩展子类要说明它是如何工作的。
```java
class Implementation implements Concept {
@Override
public void idea1() {
System.out.println("idea1");
}
@Override
public void idea2() {
System.out.println("idea2");
}
}
```
**接口中的方法将自动被设置为 `public` 类型,属性/字段将被自动被设置为 `public static final` 类型**,例如:
```java
public interface Concept {
void idea1(); // public void idea1();
// 静态属性
double item = 95; // a public static final constant
}
```
---
总结:接口(Interface)是一种抽象类型,它只包含方法的签名(方法名、参数类型、返回类型等),没有方法的具体实现(Java8 之前)。接口可以被实现(implements)多次,而一个类只能继承(extends)一个类。接口的主要作用是定义一组行为规范,让实现该接口的类能够符合规范并具有通用性。
**接口的适用场景**是当多个类具有相同的行为规范时,可以定义一个接口,让这些类实现该接口,从而统一行为规范。此外,接口还可以用来实现回调(Callback)机制,将方法作为参数传递给其他方法使用。
