Java基础系列(十二):继承

前言

Java中有一个非常重要的概念:继承。利用继承,我们可以通过一个已经存在的类构造一个新的类,继承已经存在的类就是服用这些类的方法和数据域,并且在原本类的基础上可以添加一些新的方法和域,以满足新的需求。

父类(超类)与子类

在Java中我们使用extends关键字来定义子类,extends代表的就是继承,如下例子:

/**
 * VIP用户类
 * @author Vi-Young
 */
public VIPUser extends User {

    //添加VIP会员特有的方法和字段
    ...
}

关键字 extends表示正在构造的新类派生于一个已经存在类。这个已经存在的类被称为父类(超类,基类);新创建的类被称为子类。在通过扩展父类定义子类的时候,仅仅需要指出子类和父类的不同之处。因此在设计类的时候,应该将通用的方法放在父类中,而将具有特殊用途的方法放在子类中。

重写(Override)

这里有两个类,一个是员工类(Employee),一个是经理类(Manager)。经理类是员工类的子类,但是员工类中的 getSalary()方法仅仅返回了员工的薪水,而经理类的 getSalary()需要返回的是薪水和奖金的总和,所以我们需要提供一个新的方法来覆盖父类中的这个方法。

/**
 * 经理类
 * @author Vi-Young
 */
public class Manager extends Employee {
    ...
    @Override
    public double getSalary() {
        return super.getSalary() + bonus;
    }
}

我们可以看到,上面的代码中用到了 super这个关键字,这里需要解释一下为什么我们会用这个关键字,因为Manager类的 getSalary()方法并不能直接的访问父类的私有域,如果我们想要访问这个私有域,就需要用到Employee的 getSalary()方法,这里就用到了 super关键字,这里还需要注意一点,很多人认为 superthis一样,是一个对象的引用,其实并不是这样的, super并不能赋给一个对象变量,它的作用就是告诉编译器调用父类方法的特殊关键字。

在子类中可以增加域,增加方法或覆盖超类的方法,然后绝对不能删除继承的任何域和方法。

子类构造器

public Manager(String name, double salary) {
    super(name, salary);
    bonus = 0;
}

这里的 super的意思是调用父类中具有name,salary参数的构造器

因为子类的构造器不能直接的访问父类的私有域,所以必须利用父类的构造器来对这部分私有域进行初始化,我们可以通过 super实现对父类构造器的调用,使用 super调用构造器的语句必须是子类构造器的第一条语句。

如果子类的构造器没有显式地调用父类的构造器,则将自动地调用父类默认的(无参)构造器。如果父类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用父类地其他构造器,则Java编译器将报告错误。

继承层次

继承并不仅限于一个层次,有一个公共父类派生出来地所有类的集合被称为继承层次,从某个特定的类到其祖先的路径被称为该类的继承链,一个父类可以有多个继承链,父类的不同派生类之间不存在任何关系。

原文发布于微信公众号 - Vi的技术博客(viyoungblog)

原文发表时间:2018-07-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券