目录
多态
虚拟方法调用
对象多态的总结
对象的类型转换(casting)
多态
多态在java中有俩个体现
1方法的多态,方法的重载overload和方法的重写override。
2对象的多态,抽象类和接口。
多态:对象的多种父类表现形态。
本态引用:对象引用指向本类类型的变量
多态引用:对象引用指向父类类型的变量
java引用型变量有两个类型,一个是编译时类型,和运行时类型。
编译时类型由声明该变量时使用的类型决定。
运行时类型由实际赋给该变量的对象[对象引用]决定。
若编译时类型和运行时类型不一致,就会出现多态,polymorphism。
对象的的上转型对象(upcasting )
例如:
假设 B是A的子类或者间接子类,那么如下。
B b = new B();// 本态引用
A a = new B(); //多态引用
此时对象a就是子类对象b的上转型对象。(老虎是哺乳动物一样)
对象的上转型对象的实体是由子类负责创建的,但是上转型对象会失去原对象的一些属性和功能。上转型对象具有如下特点
1 上转型对象不能操作子类声明定义的成员变量,不能使用子类声明定义的方法。
2 上转型对象可以代替子类对象去调用子类重写的实例方法。(如果子类重写的方法是实例方法,那么上转型对象调用 重写的方法 时,就是 通知 对应的子类对象去调用这些方法。因此 如果子类重写了父类的某个实例方法后,子类对象的上转型对象调用这个方法时,一定是调用了重写的方法。)
3 上转型对象可以调用子类继承的成员变量和隐藏的成员变量。
4 可以将对象的上转型对象再 强制转换 成一个子类对象,这是又具备了子类的所有属性和功能。
A extends B;
A a = new B ();
B b = (B) a
虚拟方法调用
( 简单理解,上转型对象不是父类创建的对象,而是子类对象的简化形态,不关心子类对象新增的功能,只关心子类继承和重写的功能)
利用上转型对象实现 虚拟方法调用 (virtual method invocation)
虚拟方法调用
1.编译时绑定父类类型
2.运行时绑定子类类型
虚拟方法前提:
需要存在继承或者实现关系,要有覆盖操作 成员方法:
编译时:要查看引用变量所属的类中是否有所调用的方法。(编译时检查父类类型)
运行时:调用实际对象所属的类中的重写方法。 (运行时执行子类类型)
对象多态的总结
成员变量:不具备多态性,只看引用变量所属的类。
子类的多态引用 调用的属性是其父类的属性,而不是子类的同名属性,即属性没有多态性,调用方法的时候,一定是调用子类重写的方法。
(当子类的属性和父类属性同名时)
A extends B;
A a = new B ();
B b = (B) a
多态引用的 应用举例
1 【多态数组】定义父类类型的数组,统一管理其子类重写的方法
A[] a = new A[5];
a[0] = new B();
2 多态参数 ,将父类类型作为方法的形参,在方法中操作子类重写的方法或者父类的属性。
对象的类型转换(casting)
基本数据类型
自动转换 long g = 20 ;double d = 12.0f;
强制转换 byte b = (byte)34 ;int i = ( int ) 1200L;
对象的强制类型转换称为造型
子类到父类的类型可以自动转换
子类的多种父类形态,接口形态和父类形态可以转换,需要强制转换。
A a = new B(); 上转型对象
[ B 是 A 的子类或间接子类】
父类到子类的类型转换必须通过 造型 实现
B b = (B) a; 上转型对象 造型到 子类对象