在多态机制中,并不是所有的事务都可以多态发生的,比如域与静态方法,事实上,只有普通的方法调用可以是多态的。
当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的。在本例中,为Supper.field分配了不同的存储空间。这样,Sub实际上包含两个称为field的域,它自己的和它从Super处得到的,在引用Sub中的field时所产生的默认域并非Super版本的field域,因此,为了得到Super.field,必须显示的指明Super.field。在实践中,这种情况可能不会发生,因为通常将所有的域都设置成private,因此不能直接访问他们,只能调用方法来访问。如果某个方法是静态的,它的行为同样不具备多态性。
-
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:1
-
Sub.field:1 Sub.getField:1 Sub.getSuperFiled:0
总结如下:
1.将方法调用同方法主体关联起来被称为绑定,例如:test(People p),此时People是一个接口或抽象类,此时就是绑定。
2.编译期绑定(静态)是在程序编译阶段就确定了引用对象的类型。
3.运行期绑定(动态绑定)是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
4.除了static方法和final方法(private方法属于final方法),其他所有方法都是后期绑定,Java中所有的方法都是通过动态绑定来实现多态。
5.访问某个域的行为不具有多态性。