文章目录
多态-声明类型与实际类型
要讲到java的动态绑定,那么一定绕不开的是java变量的声明类型和实际类型。
1 Object o=new Actual();
这之中,Object属于o的声明类型,Actual为o的实际类型。
Object是Actual的父类。可以这么理解,我声明o是一个人(Object),但他实际上可以是医生(Actual)也可以是警察(Actual),但他不能是一条博美∩_∩。
顺带提一下声明类型和实际类型的赋值问题。
/*再声明变量*/
Actual police;
police=o;//×
o=police;//√
o本身声明的还是一个Object类,信息数比Actual少,当将police赋值给o时,可以丢弃多余部分,而将其有的属性赋值(如身高,年龄),但不能将o赋值给police(因为属性是不够的)。
静态绑定
java的静态绑定包括private,static,final和构造方法。
这四种方法的特点是不会出现方法重写,所以不会出现子类和父类信息完全相同的方法。所以在编译的时候就能确定的方法。
动态绑定
动态绑定是一种运行时才能知道的绑定,编译时不能确定具体的调用。
java的动态绑定常见于方法的重载和重写。
如上的例子中
class police extends man{
void eat();//工作餐
void arrest();//逮捕
}
class man{
void eat();//回家吃饭
void sleep();//回家睡觉
}
void main(){
man m=new police();
m.eat();
m.sleep();
//m.arrest(); ---报错
((police) m).arrest();
}
声明一个m为人,实例化为一个警察。
- 执行eat()时,警察并不能回家吃饭,因为确定了吃的是工作餐(子类重写了父类的方法,此时执行子类的方法)。
- 执行sleep()时,警察并没有在警局睡觉的规定,所以回家睡觉(子类没有重写父类的方法,所以执行父类的方法)。
- 执行arrest()时,系统报错,因为虽然实例化为一个警察, 但声明的还是一个人,不能没有证明随便逮捕人(声明为父类的对象,不能执行子类的方法)。但拿出警察和逮捕证明后就可以逮捕人(强制类型转换,表面此对象可以作为一个子类执行)