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