前言

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

父类(超类)与子类

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

  1. /**
  2. * VIP用户类
  3. * @author Vi-Young
  4. */
  5. public VIPUser extends User {
  6. //添加VIP会员特有的方法和字段
  7. ...
  8. }

关键字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关键字,这里还需要注意一点,很多人认为super和this一样,是一个对象的引用,其实并不是这样的,super并不能赋给一个对象变量,它的作用就是告诉编译器调用父类方法的特殊关键字。

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

子类构造器

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

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

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

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

继承层次

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


公众号

扫码或微信搜索Vi的技术博客,关注公众号,不定期送书活动各种福利~

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