多态详解 ——Java学习笔记
前面的面向对象学习简单的写了一下多态,经过新的学习现在又详细的了解了多态,包括前面没学过的方法重写、向上转型、向下转型、动态绑定机制,在这里记录一下知识点
多态
一个方法在不同类中的不同实现
实现多态的前提条件:
- 继承
- 方法重写
- 父类引用指向子类对象(向上转型)
方法重写:
- 当父类中的方法无法满足子类的需求时,子类可以对该方法进行重写
- 必须和父类的方法名、返回值、参数列表完全相同,并且访问修饰符的范围不能变小
多态:
- 把父类对象指向子类对象的引用,就是把子类对象当作父类对象来使用,
- 他可以调用父类中所有的成员属性和方法(但是已经不能在调用子类自己的属性和方法)
- 但是如果子类中有重写了父类的方法,那么执行这个方法时一定执行子类的重写方法
多态的例子:
//测试类
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
animal.talk();
//以父类的名义实例化
Animal dog = new Dog();
//以子类自己的方法实现
dog.talk();
Animal cat = new Cat();
cat.talk();
}
}
//父类
class Animal {
public void talk(){
System.out.println("叫声");
}
}
//子类
class Cat extends Animal{
public void talk(){
System.out.println("喵喵");
}
}
//子类
class Dog extends Animal{
public void talk(){
System.out.println("汪汪");
}
}
引用数据类型转换
前面学习了基本数据类型的转换,自动转换和强制转换,引用数据类型转换也一样。分为向上转型和向下转型。
- 转型也是基于继承的基础上的。
向上转型
-
多态本身就是子类类型向父类类型向上转型的过程
-
将子类对象转换为父类对象就是向上转型(这个过程是自动的,可以认为自动转型)
-
父类类型 对象名 = new 子类类型();
-
-
可以把向上转型后的对象看成父类对象
-
向上转型的对象可以调用父类中的所有普通方法和成员属性,但是只能调用子类中重写的方法
向下转型
-
将父类对象转换为子类对象就是向下转型(这个过程是强制的,需要强制转换)
-
注意:
- 不能直接把一个父类对象强制转换为一个子类对象
- 必须是一个向上转型后的对象,(就是向上转型后的还原)
-
格式:
-
子类类型 对象名 = (子类类型) 向上转型后的父类对象;
-
为什么要转型
当使用多态的方式调用方法时,首先检查父类中是否有该方法,如果没有,编译错误,(不能调用子类独有的方法),所以使用多态(向上转型后)又要调用子类特有的方法时,就要做向下转型
instanceof关键字
判断某个对象是否属于类或接口
在进行向下转型时,会遇到一些异常情况,俩个对象的类型不匹配等等问题,编译没问题但是运行时会有异常,所以使用向下转型时,最好使用上instanceof关键字,避免类型转换异常
//先判断,后转型
if (animal1 instanceof Dog){
Dog dog1 = (Dog) animal1;
}
动态绑定机制
也叫做后期绑定、延迟绑定
绑定就是一个方法的调用要与方法所在的类关联起来。动态绑定就是在运行时根据具体对象的类型进行绑定
- 当有多态发生时,一定会发生动态绑定
- 动态绑定机制就是程序运行期间,会判断对象的真正的创建者是谁,就调用谁里面的方法