前言
我们接下来要学习的是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关键字,这里还需要注意一点,很多人认为super和this一样,是一个对象的引用,其实并不是这样的,super并不能赋给一个对象变量,它的作用就是告诉编译器调用父类方法的特殊关键字。
在子类中可以增加域,增加方法或覆盖超类的方法,然后绝对不能删除继承的任何域和方法。
子类构造器
public Manager(String name, double salary) {
super(name, salary);
bonus = 0;
}
这里的super的意思是调用父类中具有name,salary参数的构造器
因为子类的构造器不能直接的访问父类的私有域,所以必须利用父类的构造器来对这部分私有域进行初始化,我们可以通过super实现对父类构造器的调用,使用super调用构造器的语句必须是子类构造器的第一条语句。
如果子类的构造器没有显式地调用父类的构造器,则将自动地调用父类默认的(无参)构造器。如果父类没有不带参数的构造器,并且在子类的构造器中又没有显式地调用父类地其他构造器,则Java编译器将报告错误。
继承层次
继承并不仅限于一个层次,有一个公共父类派生出来地所有类的集合被称为继承层次,从某个特定的类到其祖先的路径被称为该类的继承链,一个父类可以有多个继承链,父类的不同派生类之间不存在任何关系。
公众号
扫码或微信搜索Vi的技术博客,关注公众号,不定期送书活动各种福利~