首页 > 编程笔记

继承是什么,Java继承详解

在 Java 中,继承是面向对象编程中重要的组成部分,几乎是所有面向对象语言中不可缺少的部分。

在面向对象的软件开发过程中,继承能够有效地实现代码的复用,大大缩短程序开发的周期,提高软件的可扩展性和可维护性。

熟练掌握继承,是学习面向对象的重要环节。

子类与父类

在 Java 程序设计中,类的继承是基于已存在的一个类构建一个新的类的机制。新类吸收已有类的属性和方法,并且能在此基础上扩展新的属性和方法。将现有的类称为父类或超类,构建的新类称为子类,如下图所示。


图 1 类的继承

通过继承的方式,子类不仅可以自动拥有父类的属性和方法,还能扩展新的属性和方法,达到代码重用,以及提高软件结构层次的目的。

如下图所示,结合动物分类图,读者可以进一步理解继承的概念和意义。


图 2 动物分类图

驯鹿和麋鹿都属于鹿科动物,水牛和黄牛属于牛科动物,而鹿科动物和牛科动物都属于动物。无论是哪类动物,都具有动物的共同属性,因此,这些动物之间会形成一种继承体系。

从分类学上来看,采用这种分类及分层的树状继承结构可以有效地进行管理和研究。

例如,人可以从事多种职业,如司机、图书馆管理员和地铁售票员等,但无论是司机、图书馆管理员,还是地铁售票员,都应该符合人的共性。因此,可以先构建一个人具有的共性类,再分别构建司机、图书馆管理员和地铁售票员的类,让这 3 个类都继承人的共性类,这样每个类就无须重复定义人的共性的代码。实际上,Java 中继承的本质也是通过模拟这种现实生活中继承的概念来实现的。

子类的继承性

在 Java 程序中,通过关键字 extends 来声明一个类是从另一个类继承而来的,一般语法格式如下:
class 子类 extends 父类{
    ... // 程序代码,子类的属性和方法
}

下面通过实例来介绍子类是如何继承父类的:
class Person {
    String name;
    int age;
    String gender;
    // Person类的其他实现...
}

class Student extends Person {
    int height;

    Student(String name, int height) {
        this.name = name;
        this.height = height;
        // 假设年龄是20,性别是"男"
        this.age = 20;
        this.gender = "男";
    }
    // Student类的其他实现...
}

class Driver extends Person {
    double salary;

    Driver(String name, double salary) {
        this.name = name;
        this.salary = salary;
        // 假设年龄是30,性别是"男"
        this.age = 30;
        this.gender = "男";
    }
    // Driver类的其他实现...
}

public class Test {
    public static void main(String[] args) {
        Student s = new Student("高同学", 168);
        Driver t = new Driver("李师傅", 6000);
        System.out.println(s.name + "身高为:" + s.height);
        System.out.println(t.name + "工资为:" + t.salary);
    }
}
运行结果为:

高同学身高为:168
李师傅工资为:6000.0

在运行上述程序的过程中,子类 Student 和 Driver 继承父类 Person 的共性属性,同时分别扩充了个性化属性身高和工资。通过继承,子类拥有父类的数据和功能,所以子类实例化的对象可以直接访问这些成员。

在 Java 中,一个类只能有一个父类,这种特点称为单重继承。

子类与对象

子类除了可以继承父类的属性和方法,还可以定义自己的属性和方法。

例如,这里定义一个父类 Dog,一个继承 Dog 类的沙皮狗类 Sharpei,并在 Sharpei 类中定义一个自己的方法 cute(),代码如下列实例所示:
class Dog {
    // 定义name属性
    public String name;

    // 定义一个公共的叫的方式
    public void shout() {
        System.out.println("动物发出的叫声!");
    }
}

class Sharpei extends Dog {
    // 在子类中扩充一个cute()方法
    public void cute() {
        System.out.println("我会摇尾巴!");
    }
}

public class Test {
    // 在main()方法中验证子类对象对父类的属性和方法的调用
    public static void main(String[] args) {
        // 实例化子类对象
        Sharpei s = new Sharpei();
        s.name = "wangcai";
        s.shout(); // 调用继承自父类的方法
        s.cute();  // 调用子类特有的方法
    }
}
运行结果为:

动物发出的叫声!
我会摇尾巴!

Sharpei 类继承 Dog 类,在扩充 cute() 方法,以及实例化 Sharpei 子类对象之后,通过该对象可以访问父类的 name 属性和 shout() 方法,也可以访问自己定义的 cute() 方法。

推荐阅读