向下转型和向上转型:
向上指子类到父类,向下指父类到子类(要加强制类转换符)
多态机制:
Animal A=new cat();Animal是cat的父类。这是子类转换为父类,就是向上转换,允许使用。
编译阶段A的数据类型是Aniaml,编译通过,字节码中有相应的方法,称这个过程为静态绑定。
但是在JVM中真实创建的是cat对象,调用的方法也是cat里面的方法。这称为动态绑定。
这种现象父类型引用指向子类型对象,这种机制导致了编译和运行阶段绑定的不同,这种机制就叫多态。
如果在代码中调用了cat()中有的东西,但是Animal中没有的,那么编译就通过不了。
强制转换;
bird B=(bird) A;
程序编译会通过,但是运行会异常。因为JVM中真实存在的是个cat类型。这称之为类型转换异常
所有向下转型存在隐患。而向上转型只要编译通过,运行就不会异常。为了避免向下转型的异常,需要使用instance运算符。语法格式;
引用 instanceof 数据类型名
返回的是布尔值,如A instanceof Animal;返回为true说明指向对象类型确实是Animal。
比如可以用if语句判断,如果是bird就用bird B=(bird)A转换,如果是cat就用cat B=(cat) A转换。
所以用instance的话就可以在运行阶段判断这个类型对不对,避免编译时的错误。转型的目的就是为了使用子类的方法,用instance来避免转换时的异常。