目录
-
为什么引入继承?
-
假若现在有一个员工类Employee,在这里面的员工有普通职员,有经理,他们都领薪水,不过薪资待遇有一些不同,普通职员的工资组成只有基本工资,但是经理既有普通工资也有项目奖金,这种情况下,就需要用到继承。
-
因为经理定义了一个新类Manager,并增加了一些新功能。但可以拥有Employee类中已经编写的代码,并保留了Employee类的所有字段
-
定义子类
Manager类继承了Employee类,这里使用关键字extends来表示继承
-
格式:
public class Manager extends Employee { added methods and fields; }
-
关键字extends表明正在构建的新类Manager类派生于一个已经存在的类Employee类
-
这个已经存在的类Employee称为超类(superclass),基类(base class),父类(parent class)
-
新类称为子类(subclass),派生类(derived class),孩子类(child class)
-
超类和子类是Java最常用的两个术语
-
尽管Employee类是超类但不意味着超类币子类有更多的功能,其实恰恰相反。子类比超类有更多的功能。
-
在这里给出Employee类
-
在这里给出Manager类
-
子类不仅有自己的方法和实例字段,还从超类中继承了name,salary,和hireDay这三个字段
-
子类的对象不仅能调用自身类的方法可以调用其父类的方法
-
在扩展超类定义子类的时候需要指出子类和超类的不同之处,因此在设计类的时候应该将一般的类放在超类中,将比较特殊的类放在子类中
-
注意:私有的静态字段或者私有的方法属于类本身,无法被子类继承
覆盖方法(方法重写)
-
超类中的某些方法并不适用于子类,像超类中的getSalary方法,实际在Manager类中应该返回的是Salary和奖金的总和。这时就需要在子类中写一个getSalary方法来覆盖超类中的方法
-
这样并不行,因为这样getSalary会不断地调用自身,直到程序的崩溃,在这里我们想要调用的是超类中的getSalary方法,在这里,就需要用到super关键字了
-
super.getSalary就指的是调用超类的getSalary方法,就不会让程序重复执行进而引起程序崩溃了
-
那些方法不能被重写?
-
static方法,它属于类,不属于实例
-
final方法,它是常量,不能被改动
-
private方法,他是私有的不能被重写
-
子类构造器
-
由于Manager类的构造器不能访问Employee类的私有字段,所以必须通过一个构造器来初始化这些私有字段
-
在这里可以使用特殊的super语法来调用这个构造器
-
注意:使用super语法调用构造器必须是子类构造器的第一条语句
-
子类的有参构造器
-
父类的有参构造器,供super调用
-
在主程序中实例化Manager类,使用Manager的有参构造初始化字段,并打印输出字段的值
-
如果子类在构造时没有显式的调用父类的构造器,那么就调用父类的无参构造器,如果父类没有无参构造器,那么就会报错
-
下面展示默认调用了父类的无参构造器
-
this关键字的两个含义
-
指示隐式参数的引用
-
调用该类的其他构造器
-
-
super关键字的两个含义
-
调用超类的方法
-
调用超类的构造器
-
-
调用构造器的语句只能作为另一个构造器的第一条语句出现,参数可传本类(this)的构造器,也可以传递给超类(super)的构造器
继承层次
-
什么是继承层次?
-
由一个公共超类派生出来的所有类的集合称为继承层次
-
-
什么是继承链?
-
从某个特定的类到其祖先的路径称为该类的继承链
-
-
Java只支持单继承,不支持多继承,但提供了一些多重继承的功能
多态
-
多态的引出:
-
在Java中对象变量是多态的,一个对象变量的类型是固定的,例如new employee();这个变量类型就是employee类型的。但是对象变量的引用类型却不是固定的
-
-
什么是多态?
同一个方法可以根据发送对象的不同采用多种不同的行为方式
-
多态存在的条件:
-
两个类有继承关系
-
子类重写父类方法
-
父类引用指向子类对象
-
-
为什么要用多态?
-
在现实世界中一个小明即属于学生类Student也属于Person类,出现了多种形态,当父类引用变量指向子类时,多态就时一个接口,在使用不同的实例而执行不同的操作
-
-
注意:在使用多态后的父类指向子类后,父类引用变量调用方法时,会调用子类重写的方法
-
子类能调用父类的方法和自身的方法,父类能调用自身的方法和子类重写的方法,不能调用子类独有的方法
参考书籍:Java核心技术 卷1(原书第11版)