向上转型:
可以将子类对象看作是父类对象叫做“向上转型”,由于向上转型是从一个较为具体的类向较为抽象的类的转换,所以它总是安全的。
例如:可以将正方形、长方形叫做是四边形,但是不能说四边形是正方形或长方形。
向下转型:
向下转型可以从向上转型推出,是由子类对象向父类方向上的转型,这样的转型通常是会出问题的,就好比说,你可以说麻雀是鸟类,但是你不能说所有的鸟类都是麻雀,这是非常不符合逻辑的,所以在直接将父类对象赋给子类时会产生编译报错,因为父类对象不一定是子类的实例。
所以在做向下转型时,需要告知编译器,这个父类对象就是子类对象,即强制的将父类对象转换成某个子类对象,这样的转型方式称为向下转型;
例如:
Parent p = new Parent();
Child c = (Chile)p;
但是在程序执行向下转型时,如果父类不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前应该养成一个好的习惯,就是用instanceof关键字来判断父类对象是否是子类对象的实例,
instanceof语法如下:
myobject instanceof ParentClass
if(p instanceof c){
Child c = (Chile)p;
}else{
//doSomeThing.....
}