曾经写过一篇关于动态绑定的,也就是关于java多态的,但是当子类属性,覆盖父类属性的时候,
是否依然可以调用子类的属性???
可惜答案是否定的!
直接上程序:
父类:
<span style="font-size:18px;">public class Animal {
public int m=1;
public int sing(){
return 2;
}
}</span>
子类:
<span style="font-size:18px;">public class Mao extends Animal{
public int m=3;
public int sing(){
return 5;
}
}
</span>
程序:
<span style="font-size:18px;">public static void main(String[] args) {
Animal ani=new Mao();
System.out.println(ani.sing()+"--------" +ani.m);
}</span>
运行程序结果:
5--------1
属性竟然是父类的,
原因如下:
变量是静态绑定,
方法是动态绑定。
因为
<span style="font-size:18px;">Animal ani=new Mao();</span>
就是把子类转型为父类
也就是多态的时候的特性;
子类转型为父类的规则:
只能调用父类的属性
只能调用被子类复写的方法,,(如果子类没有复写,则去父类查询,父类如果有,则调用)
PS:以前我还真不知道,多态还隐藏这个属性的小问题,,
记住,属性静态绑定;
方法动态绑定,KO:
再加点,以后自己用:
子类覆盖父类要遵循“两同两小一大”
“两同”即方法名相同,形参列表相同
“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等
“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等