继承
什么是继承
继承是指一个对象直接使用另一对象的属性和方法。继承的基本语法
class 子类名 extends 父类名{};
e.g.:
class Animal{}
class Dog extends Animal{}
- 继承的规则
- Java只支持单继承,不支持多继承
- Java支持多重继承
- 构造方法不能被继承
- 能够继承父类的public和protected成员变量(方法),不能够继承父类的private成员变量(方法)
- 父类的包访问权限成员变量(方法),如果子类和父类在同一个包下,则子类能够继承,否则,子类不能够继承
- 子类可以继承的父类成员变量(方法),如果在子类中出现了同名称的成员变量(方法),则会发生隐藏现象,即子类的成员变量(方法)会屏蔽掉父类的同名成员变量(方法)
重载
重载
在一个类里面,方法名字相同,而参数不同。重载的规则
- 方法名相同
- 必须改变参数列表,即参数类型、数量、顺序至少一项不同
- 可以改变返回类型
- 可以改变访问修饰符
- 可以声明新的或更广的检查异常
- 方法能够在同一个类中或者在一个子类中被重载
重写
重写
子类对父类的允许访问的方法的实现过程进行重新编写。重写的规则
- 方法名、参数列表和返回类型必须与被重写的方法完全相同
- 声明为final的方法不能被重写
- 静态方法不能被重写,但是能够被再次声明来隐藏父类的静态方法
- 非静态方法不能被重写为静态方法
- 重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常,反之则可以
- 如果不能继承一个方法,则不能重写这个方法
重载与重写的异同
不同点 | 重载 | 重写 |
---|---|---|
方法名 | 必须相同 | 必须相同 |
参数列表 | 必须不同 | 必须相同 |
返回值 | 没有要求 | 必须相同 |
异常 | 没有要求 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问权限 | 没有要求 | 一定不能做更严格的限制(可以降低限制) |
应用范围 | 可以用于同一个类的所有方法,包括从父类继承来的方法 | 只能用于子类覆盖父类的方法 |
super
在什么下情况会使用super关键字?
- 在子类的构造方法中调用父类的构造方法(必须把super放在方法的首行)
- 在子类中访问父类被隐藏的方法和变量
在什么情况下会出现方法或变量被隐藏的现象?
- 在一个方法内,当局部变量和类或父类的成员变量同名时,只有局部变量在方法了内可见
- 当子类的某个方法覆盖了父类的一个方法,在子类的范围内,父类的方法不可见
- 当子类中定义了和父类同名的成员变量时,在子类的范围内,父类的成员变量不可见
多态
什么是多态
多态是同一个行为具有多个不同表现形式或形态的能力。它是指当系统A访问系统B的服务时,B可以通过多种实现方式来提供服务,而这一切对系统A是透明的。多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象
对象的向上转型
将子类的对象赋值给父类的引用对象的向下转型
将父类的对象赋值给子类的引用;
先把一个对象向上转型,再强制类型转换赋值给子类的引用引用调用的结果
一个引用能调用哪些成员(方法和变量)取决于这个引用的类型。
一个引用调用的是哪个方法取决于这个引用指向的类型。