多态:多态指的是编译时类型变化,而运行时类型不变。 6 i' X4 \3 k# X" h/ @ P
多态分两种:
! Y# a/ o, U! h s" E5 B/ t① 编译时多态:编译时动态重载;
; t4 u" P2 n. k) d% g; e# Q* @② 运行时多态:指一个对象可以具有多个类型。
) S1 f: J, @; l
# Q' C1 H& T) Y6 ~! ]( z% i1 V对象是客观的,人对对象的认识是主观的。
3 D+ F9 b# R' X1 }. t' q. _0 x例:
2 ~6 x7 T9 W) J& x9 w) D6 zAnimal a=new Dog();查看格式名称; 8 K" x2 b/ M- d7 W
Dog d=(Dog)a。声明父类来引用子类。 {! g v* J/ F, D
(思考上面的格式) 9 n' G H8 X; L- S( r
V& C$ ~. @; [9 g
运行时多态的三原则:(应用时为覆盖) + Q. b- N, L# x5 P" T
1、对象不变;(改变的是主观认识) 6 O) X& w& j* A) v) K/ z
2、对于对象的调用只能限于编译时类型的方法,如调用运行时类型方法报错。 ; { t' |) x5 _6 D
在上面的例子中:Animal a=new Dog();对象a的编译时类型为Animal,运行时类型为dog。
4 E6 c; U* T2 f2 V: \6 N4 \4 L! m注意:编译时类型一定要为运行时类型的父类(或者同类型)。 ( g5 }; l3 E7 K6 M7 W3 C6 _
对于语句:Dog d=(Dog)a。将d强制声明为a类型,此时d为Dog(),此时d就可以调用运行时类型。注意:a和d指向同一对象。 ( l1 I+ a/ h: Q2 ?+ J4 |
3、在程序的运行时,动态类型判定。运行时调用运行时类型,即它调用覆盖后的方法。 |