转型是面向对象多态性的一个体现。
向上转型:将子类的对象赋值给父类的引用(引用可以理解为对象)。
比如Student继承Person,那么这样表示:
Student s = new Student(); Person p = s ;
以上两步等价于下面的一步:
Person p = new Student();
1.一个引用能调用哪些成员(变量和函数),取决于这个引用的类型。这就是说,p只能调用Person类中定义的成员,不能调用s中独有的成员。
2.而一个引用调用的是哪一个方法,取决于这个引用指向的对象。就上面的例子说,如果Student和Person类中都有introduce()方法(Students中覆写了Person中的introduce()方法),那p.introduce();就指向s中的introduce()方法。
向下转型:将父类的对象赋值给子类的引用。
Student s1 = new Student(); Person p = s1 ; Student s2 = (Student)p ;
可以看出,向下转型要先向上转型,再强制向下转型。
同样,上面三句可以等效成下面两句:
Person p = new Student(); Student s = (Student)p;
下面的例子是错误的向下转型:
Person p = new Person();//向下转型没有先向上转型 Student s = (Student)p;
--------------------------Oct.31
为什么要对象转型呢?思考了一下,可能有下面的原因:
对于向上转型,回顾上面的第一点:“一个引用能调用哪些成员(变量和函数),取决于这个引用的类型。”子类对象如果想要调用父类对象的成员,就可以向上转型。
对于向下转型,回顾上面的第二点:“一个引用调用的是哪一个方法,取决于这个引用指向的对象。”父类对象强制转成子类对象,就可以调用子类对象的方法。
以后在应用中慢慢体会。
(end)