为了准备学校期中考试,特意复习了继承与多态各种情况的分析:
在instantiate一个物体(object)时,分别有两种类型需要注意:
- Actual type (这个object的实际类型,也可以叫做static type),这个类型是在代码编译期间用到的
- Dynamic type (这个类型是代码在run-time的时候用到的)
Animal a = new Dog();
在这行简单的代码中,Animal为actual type,Dog是dynamic type。这就是在使用多态了(polymorphism)
那么,我们使用多态的好处是什么呢:
- 在程序compile期间,a的类型是animal,也就是说如果a调用了一个方法,这个方法在animal class里面存在,那么就不会报错,如果不存在,就会报错。
- 在程序运行期间,a被当作dog type,所以被调用的方法也将是Dog class里面的
需要注意这么几点:
如果我们想用Dog class里面独有的方法,也就是说这些方法不是从Animal那边继承下来的,调用时需要先对a 进行 casting。如下:
((Dog)a).bark();
Downcasting 和 upcasting永远不会在编译期间报错,然而sidecasting在编译期间报错。
但是,不在编译期间保存并不以意味着在运行阶段不会报错。
总结如下:
- Static type决定了一个物体在编译期间被当作的类型
- Dynamic type决定了一个物体在运行阶段被当作的类型
这是我在CSDN第一篇原创文章,如有不对,请多多指教~!