# 7. 抽象类与接口

## 7.1 什么是抽象类

> 抽象类是它的所有子类的公共属性的集合，是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。首先从现实世界中的对象可以抽象出软件系统中的对象（保留主要属性和行为，去掉次要属性和行为），然后从软件系统中的对象可以抽象出软件系统中的类（去掉属性值，把具体的对象变成了抽象的概念），而抽象类则是对多个类的抽象结果，抽象类进一步描述了多个具体类的共同特征和行为。从系统分析的角度，使用抽象类可以更好地刻画自然界的抽象概念，更有效地完成软件系统与自然行为系统的映射，从系统设计实现的角度，使用抽象类可以更好地利用这些共同属性和操作，避免代码的重复编写，从而减少出错的几率，提高程序的开发效率。



抽象类简单理解，就是这个对象是什么。人和狗的抽象类都是动物。抽象类除了不能实例化对象之外，类的其它功能依然存在，成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象，所以抽象类必须被继承，才能被使用。也是因为这个原因，通常在设计阶段决定要不要设计抽象类。



Java是通过关键字abstract来实现抽象类的：

```java
Modifies abstract class ClassName {…}
```

这里需要注意的是抽象类的修饰符必须为public或者protected，不能是private，因为创建抽象类，就是要被其他类继承，用private修饰了，则不能被子类继承，子类便无法实现该方法。

## 7.2 抽象方法

如果是实现一种方法，其具体内容由子类决定，就是抽象方法了。抽象方法只有声明，没有具体的实现：

```java
abstract void method();
```

- 如果一个类包含抽象方法，那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法，或者声明自身为抽象类。



## 7.3 继承抽象类

```java
abstract class A{
	
	public void method(){
		System.out.println("非抽象方法");
	}
	
	public abstract void abstract_method();
}

class B extends A{

	@Override
	public void abstract_method() {
		System.out.println("新方法");
	}
	
}
public class TestDemo {

	public static void main(String[] args) {
		A a = new B();
		a.abstract_method();
	}
}
```



## 7.4 什么是接口

接口在Java中书以抽象类型，是抽象方法的集合。接口是比抽象类更抽象的存在，Java接口的方法都没有实现，并且都必须是抽象的。

从抽象层次上理解，抽象类是对类的抽象，接口是对行为的抽象。

接口中的所有属性默认为：**public static final** 

接口中的所有方法默认为：**public abstract** 



下面通过一个例子来看以下接口到底是什么

## 7.5 接口的实现

接口的继承关键字是 implements 



```java
public interface Eat {
	public void willEat();
}

public interface WatchDoor {
	public void willWatchDoor();
}

public interface Think {
	public void willThink();
}

public class Dog implements Eat,WatchDoor{
 
	@Override
	public void willEat() {
		System.out.println("我会吃");
	}
 
	@Override
	public void willWatchDoor() {
		System.out.println("我会看家");
	}
}

public class Person implements Eat,Think{
 
	@Override
	public void willEat() {
		System.out.println("我会吃");
	}
 
	@Override
	public void willThink() {
		System.out.println("我会思考");
	}
}


```

从示例代码应该可以看出，接口的主要功能是对于行为的继承。



