参考《Java疯狂讲义》
什么是多态?:
java引用变量有两个类型,一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行是类型不一致,就可能出现所谓的多态
- 1 引用变量的自动类型转换:
编译时类型:父类
运行时类型:子类
自动类型转换的引用变量在编译阶段只能调用其编译类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,在编写代码时,引用变量只能调用编译时类型所具有的方法
2引用变量强制类型转换:
编译时类型:子类
运行时类型:父类
如果需要让这个引用变量调用它运行时的方法,这需要把它强制转换为运行时类型。
当把子类对象赋值给父类引用变量时(向上转型-自动类型转换)
这种类型转换运行时,实际表现出子类对象的行为方式。
但把一个父类对象赋给一个子类引用变量时,就需要进行强制类型转换,而且还可能出现ClassCastException异常,使用instanceof运算符可以让强制类型转换更加安全。
3 instanceof运算符
instanceof运算符前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口),它用于判断前面的对象是否是后面的类,或者子类,实现类的实例。如果是返回true,否则返回false。
在使用instanceof运算符时需要注意:instanceof运算符前一个操作数的编译时类型要么与后面的类型相同,要么与后面的类型具有父子继承关系,否则会引起编译错误。