向下转型操作:将父类转化为某个子类。如:将Object类转为String类,再通俗讲就是将四边形转为平行四边形。通常这样的转型会出错,因为四边形不一定是平行四边形,这时我们通常需要用instanceof先进行判断。
在程序执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生ClassCastExceptio异常。因此在执行向下转型之前需要养成一个良好的习惯,就是判断父类对象是否为子类对象的实例,通常我们使用instanceof来完成。instanceof的语法格式如下:
myobject instanceof ExampleClass
其中,myobject :某类的对象引用 ExampleClass : 某个类
示例:
class Quarangle{
public void draw(Quarangle q){
System.out.println("this is Quarangle");
}
}
class Square extends Quarangle{
}
class Anything{
}
public class instanceofTest {
public static void main(String[] args) {
Quarangle quarangle=new Quarangle();
Quarangle qu=new Square();
Square sq=new Square();
if(quarangle instanceof Square){
System.out.println("==========");
}else {
System.out.println("######");
}
if(sq instanceof Quarangle){
sq.draw(sq);
}else {
System.out.println("----");
}
if(qu instanceof Square){
System.out.println("*****");
}else {
System.out.println("&&&");
}
// if(quarangle instanceof Anything){ //这条语句idea直接编译没通过,eclipse是否能通过可以去尝试一下
// Anything anything=(Anything) quarangle;
// }
}
}
运行结果:
<span style="color:#000000;">######
this is Quarangle
*****
</span>
结果分析:
条件:Quarangle 是Square的父类
第一组:因为Quarangle 是Square的父类,所以当我们实例化一个Quarangle 时,他有可能是Square类,故在编译上没有问题。但父类不一定是子类的一个实例,子类一定是父类的一个实例,所以输出if 判断为 false
第二组:子类一定是父类的一个实例,所以 if 判断为true
第三组: 我们实例化的是一个Quarangle对象,但已经明确知道了这个Quarangle是Square类型的,即qu是Square的实例,所以 if 判断为true
第四组: Anything 不是Quarangle的子类,也不是其父类,两者并没有联系,所以 未通过编译。