什么是继承,Java继承的具体实现(附带实例)
继承是面向对象编程中最重要的概念之一,从字面上来理解就是从前者那里得到前者所拥有的能力,也就是说某个类能通过继承来得到另一个类的属性和方法。

图 1 人的继承
举一个例子,如上图所示,人具有年龄属性和行走能力,女人和男人都继承了人,那么他们也都具有年龄属性和行走能力。此时,女人可以添加生孩子的能力,而男人则可以添加干重体力活的能力。继续往下继承,女厨师、女学生和女教师可以继续继承女人,从而拥有女人的属性和能力。而男厨师、男学生和男教师则可以继承男人,从而拥有男人的属性和能力。
面向对象编程是根据客观世界规律所提出的一种编程思想,某些对象之间具有某种关系,而继承的性质刚好符合这种关系,所以需要用继承机制来描述。
总的来说,继承能给我们带来下面两个好处:
为了让大家能更好地理解什么是继承,下面通过实例来进行说明:
接着我们定义一个 Woman 类,由于它具有 Person 类的属性和能力,所以可以通过继承的方式来描述该类:
定义好 Woman 类后我们来测试一下效果:

图 2 只支持单继承
仍然以 Person 类和 Woman 类为例,将 Woman 对象转换为 Person 对象是允许的,它可以调用 Person 类拥有的 eat() 方法,但是它无法调用 Woman 类拥有的 deliver() 方法,代码如下:
与向上转换相反的是向下转换,向下转换是将父类对象转换为子类对象,这种情况是不允许的,因为子类具有比父类更多的属性和方法,所以不能安全地进行转换。下面的代码运行时将报转换异常“java.lang.ClassCastException”。

图 1 人的继承
举一个例子,如上图所示,人具有年龄属性和行走能力,女人和男人都继承了人,那么他们也都具有年龄属性和行走能力。此时,女人可以添加生孩子的能力,而男人则可以添加干重体力活的能力。继续往下继承,女厨师、女学生和女教师可以继续继承女人,从而拥有女人的属性和能力。而男厨师、男学生和男教师则可以继承男人,从而拥有男人的属性和能力。
面向对象编程是根据客观世界规律所提出的一种编程思想,某些对象之间具有某种关系,而继承的性质刚好符合这种关系,所以需要用继承机制来描述。
总的来说,继承能给我们带来下面两个好处:
- 继承能很好地描述某些对象之间的关系,有助于编程人员进行程序设计;
- 继承能提高代码的复用性,某个类只需继承另一个类便可得到该类的属性和能力,这样就可以避免编写相同的代码,从而提升代码的复用性。
Java继承的具体实现
下面我们来看看 Java 如何实现类的继承。整体语法如下:访问修饰符 class 类名 extends 父类名{ ...... }前半部分是我们熟悉的常规类定义语法,重点是后半部分,可以看到是通过 extends 关键字来指定父类的。
为了让大家能更好地理解什么是继承,下面通过实例来进行说明:
public class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } void eat() { System.out.println("吃东西"); } }我们定义了 Person 类,该类包含了 name 和 age 两个属性,同时具有吃东西的能力。
接着我们定义一个 Woman 类,由于它具有 Person 类的属性和能力,所以可以通过继承的方式来描述该类:
public class Woman extends Person { boolean isDelivered; Woman(String name, int age, boolean isDelivered) { super(name, age); this.isDelivered = isDelivered; } public void deliver() { System.out.println("生小孩"); this.isDelivered = true; } }此时的 Woman 类便具有了 name 和 age 两个属性以及 eat() 方法,这样我们就可以避免编写重复的代码了。假如 Woman 类还要增加是否生过小孩的属性和生小孩的方法,那么可以直接在 Woman 类中添加 isDelivered 属性和 deliver() 方法。
定义好 Woman 类后我们来测试一下效果:
public class Woman extends Person { ...... public static void main(String[] args) { Woman w = new Woman("小莉", 25, false); w.eat(); w.deliver(); System.out.println(w.name + " " + w.age + " " + w.isDelivered); } }运行结果为:
吃东西
生小孩
小莉 25 true
程序中创建一个 Woman 对象“小莉”,然后分别调用它的 eat() 方法和 deliver() 方法,并且将它的属性都打印出来。从中我们可以清晰地看到继承的效果,Woman 类具有了 Person 类的所有属性和方法,并且还能根据自己的需要添加属性和方法。
Java 语言只支持单继承的方式,它不像 C++ 语言可以进行多继承。所谓的单继承是指某个子类只可以继承一个父类,而多继承则指某个子类可以继承多个父类。如下图所示,类 B 继承类 A 是可以的,但是类 C 同时继承类 A 和类 B 则是不允许的。
图 2 只支持单继承
Java父子类的转换
当两个类互为父类和子类时,将子类对象转换为父类对象的过程称为向上转换。向上转换在 Java 中是允许的,因为子类肯定具有父类的所有属性和方法,所以能够安全地将子类对象转换为父类对象。仍然以 Person 类和 Woman 类为例,将 Woman 对象转换为 Person 对象是允许的,它可以调用 Person 类拥有的 eat() 方法,但是它无法调用 Woman 类拥有的 deliver() 方法,代码如下:
public class InheritanceTest2 { public static void main(String[] args) { Person p = new Woman("小莉", 25, false); p.eat(); } }
与向上转换相反的是向下转换,向下转换是将父类对象转换为子类对象,这种情况是不允许的,因为子类具有比父类更多的属性和方法,所以不能安全地进行转换。下面的代码运行时将报转换异常“java.lang.ClassCastException”。
public class InheritanceTest3 { public static void main(String[] args) { Woman w = (Woman) new Person("小莉", 25); w.eat(); } }