多态陷阱---域与静态方法

来源:互联网 发布:网络交换机的安装 编辑:程序博客网 时间:2024/06/18 17:29

最近又看了一遍Java编程思想,准备再系统的巩固一下基础知识

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

        

class  Super{    public int field=0;    public int getFiled() {        return field;    }}class Sub extends  Super{    public int field=1;    public int getFiled() {        return field;    }    public int getSuperFiled() {        return super.field;    }}public class FieldAccess {    public static void main(String[] args) {        Super s1 = new Sub();        System.out.println("Sub.field:"+s1.field+ " Sub.getField:"+s1.getFiled());        Sub s2 =new Sub();        System.out.println("Sub.field:"+s2.field+ " Sub.getField:"+s2.getFiled()                +" Sub.getSuperFiled:"+s2.getSuperFiled());    }}
结果:
Sub.field:0 Sub.getField:1Sub.field:1 Sub.getField:1 Sub.getSuperFiled:0

Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Supper.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域,它自己的和它从Super处得到的,在引用Sub中的field时所产生的默认域并非Super版本的field域,因此,为了得到Super.field,必须显示的指明Super.field

在实践中,这种情况可能不会发生,因为通常将所有的域都设置成private,因此不能直接访问他们,只能调用方法来访问。

如果某个方法是静态的,它的行为同样不具备多态性。

class StaticSuper{    public static String staticGet() {        return "base staticGet";    }    public String dynamicGet(){        return "base dynamicGet";    }}class StaticSub extends  StaticSuper{    public String dynamicGet() {        return "Sub dynamicGet";    }    public static String staticGet() {        return "Sub staticGet";    }}public class StaticPolymorphism {    public static void main(String[] args) {        StaticSuper sup =new StaticSub();        System.out.println(sup.staticGet());        System.out.println(sup.dynamicGet());    }}
结果:
base staticGetSub dynamicGet

原创粉丝点击