题目
什么是继承?Java 是单继承还是多继承?为什么用单继承?
答案
@[toc]
---
## 什么是继承?
继承其实是面向对象编程中的一个重要特性,并不是 Java 特有,它允许一个类从另一个类继承属性和方法。被继承的类称为父类或超类,继承这些属性和方法的类称为子类或派生类。
Java 中的继承关系使用关键字 `extends` 来标识,示例代码如下:
```java
public class Cat extends Animal{
// 为新类增加新的方法
public void run(){
System.out.println("I'm running");
}
}
```
这种关系可以表述为**子类是父类的一种类型**。
`Cat` 继承 `Animal` 后,自动拥有了父类 `Animal` 中的方法,并可以直接调用,另外,还可以对父类的方法进行重写/覆盖(`@Override`)
向上转型和向下转型是继承中的两个重要概念:
- **向上转型(Upcasting)**:子类转成父类,程序中出现父类对象的任何地方都可以用子类对象置换(事实上,这是多态的一种体现)
```java
Animal cat = new Cat(...); // 向上转型 Cat->Animal
```
需要注意的是:**父类引用变量指向子类对象后,只能使用父类已声明的方法**,但方法如果被重写会执行子类的方法,如果方法未被重写那么将执行父类的方法。
- **向下转型(Downcasting)**:父类转成子类,有时候也可能需要**将某个父类的对象引用转换成子类的对象引用,调用一些子类特有而父类没有的方法**。对象向下转型的语法与数值表达式的类型转换类似,仅需要用一对圆括号将目标类名括起来,并放置在需要转换的对象引用之前就可以了。例如:
```java
Animal animal = new Cat(...); // 向上转型 Cat->Animal
Cat cat = (Cat) animal; // 向下转型 Animal->Cat,animal 的实质还是指向 Cat
```

## Java 是单继承还是多继承?
**在 Java 中,子类只能继承一个父类**。也就是**单继承**。

**Java 语言本着简单的原则舍弃了 C++ 中的多继承,这样也会使程序更具安全性**。
那么多继承到底带来什么坑?其实也不难理解:
- 如果一个子类拥有多个父类的话,那么当多个父类中有重复的属性或者方法时,子类的调用结果就会含糊不清,也就是存在**二义性**。
- 同时多继承也会增加代码的耦合性,导致**代码的可维护性和可扩展性降低**。因此 Java 使用了单继承。
Java 采用单继承的设计,但是通过接口(interface)可以实现多重继承的效果。接口是一种特殊的抽象类,它只定义了一组抽象方法和常量,不包含实现代码。一个类可以实现多个接口,从而具备多重继承的能力,但是本质上它仍然只能真正的继承(extends)一个类。
