对象的转型(casting)有两种,一种是向上转型,一种是向下转型。
向上转型:父类引用指向子类对象。这属于自动类型转换,编译器会自动完成。
上一节的多态中,形参为父类Animal, 但是调用时实参为子类对象Dog,就是属于自动类型转换。
另外,下图中的
Animal b = new Dog();//这就是向上转型(自动完成)
也是这种情况。在这里,Animal是告诉编译器b的类型是什么,(其作用就类似int b的中int一样),所以b的类型是Animal,但是,new Dog() 造成的结果,就是b运行时,可以调用Dog这个类型里的与Animal也有的shout()方法。所以其运行结果是"旺旺旺“。
这就是向上转型的自动完成。
向下转型:向上转型后的父类引用的变量,只能调用它的编译类型的方法,不能调用它运行时的类型的方法。如果要调用,需要进行类型的强制转换。
在上面的例子里,b就是向上转型后的父类引用的变量,Animal就是所谓的编译类型。Dog就是运行类型。所以当b调用Dog这个类型里特有的seeDoor()方法时,就报错。
如果仍然想使用seeDoor()方法,就需要使用类型的强制转换如下: