《java编程思想》第8章,多态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/attack_breast/article/details/82284313

在多态机制中,并不是所有的事务都可以多态发生的,比如域与静态方法,事实上,只有普通的方法调用可以是多态的。

当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Supper.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域,它自己的和它从Super处得到的,在引用Sub中的field时所产生的默认域并非Super版本的field域,因此,为了得到Super.field,必须显示的指明Super.field。在实践中,这种情况可能不会发生,因为通常将所有的域都设置成private,因此不能直接访问他们,只能调用方法来访问。如果某个方法是静态的,它的行为同样不具备多态性。

  1. class Super{

  2. public int field=0;

  3. public int getFiled() {

  4. return field;

  5. }

  6. }

  7. class Sub extends Super{

  8. public int field=1;

  9. public int getFiled() {

  10. return field;

  11. }

  12. public int getSuperFiled() {

  13. return super.field;

  14. }

  15. }

  16. public class FieldAccess {

  17. public static void main(String[] args) {

  18. Super s1 = new Sub();

  19. System.out.println("Sub.field:"+s1.field+ " Sub.getField:"+s1.getFiled());

  20. Sub s2 =new Sub();

  21. System.out.println("Sub.field:"+s2.field+ " Sub.getField:"+s2.getFiled()

  22. +" Sub.getSuperFiled:"+s2.getSuperFiled());

  23. }

  24. }

答案是:

  1. Sub.field:0 Sub.getField:1

  2. Sub.field:1 Sub.getField:1 Sub.getSuperFiled:0

总结如下:

1.将方法调用同方法主体关联起来被称为绑定,例如:test(People p),此时People是一个接口或抽象类,此时就是绑定。

2.编译期绑定(静态)是在程序编译阶段就确定了引用对象的类型。

3.运行期绑定(动态绑定)是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

4.除了static方法和final方法(private方法属于final方法),其他所有方法都是后期绑定,Java中所有的方法都是通过动态绑定来实现多态。

5.访问某个域的行为不具有多态性。

猜你喜欢

转载自blog.csdn.net/attack_breast/article/details/82284313