并不是所有的事物都可以多态的发生,多态只适用于普通的方法调用(private方法和final方法肯定不具有多态,包访问权限的方法,根据导出类和基类的位置决定,均在包内则可以继承)。
1、无法“覆盖”私有方法
private方法自动被当作final方法,并且对导出类屏蔽。如果在导出类中具有一个和基类private方法一摸一样的方法,这不是多态。这只是导出类中的一个全新的方法。
如本例中PrivateOverride的private f()方法在子类Derived中不可见,因此不可能被重载;Derived对象中f()方法是一个全新的方法。当向上转型时:PrivateOverride d = new Derived(); d是无法看见Derived()的新方法(即PrivateOverride没有的接口)的。
例程:
package polymorphism;
public class PrivateOverride {
private void f(){
System.out.println("PrivateOverride's private f()");
}
public static void main(String[] args){
PrivateOverride d = new Derived();
d.f();
}
}
class Derived extends PrivateOverride {
public void f(){
System.out.println("Derived public f()");
}
}
/* Output
PrivateOverride's private f()
*/
2、无法覆盖域
任何域访问操作都是在编译期解析的,因此不是多态。如果你直接访问某个域,这个访问会在编译期进行解析(编译期基类的域解析会先于导出类的域解析),就像下面所演示的。
本例中:p.field就是直接访问field这个域,是在编译期完成的。sp.field和sb.field分配了不同的存储空间,Sb实际上包含了两个field域:它自己的和它从Super处得到的。并且在引用sb.field时默认域并非Super版本的field域,引用sp.field时默认域是它自己的field域。
例程:
package polymorphism;
class Super{
public int field = 1;
public int getField(){
return field;
}
}
class Sub extends Super {
public int field =2;
public int getField() {
return field;
}
public int getSuperField() {
return super.field;
}
}
public class FiledAccess {
public static void main(String[] args) {
Super sp = new Sub();
Sub sb = new Sub();
System.out.println("sp.field = "+sp.field+" sp.getField "+sp.getField());
System.out.println("sb.field = "+sb.field+" sb.getField "+sb.getField()+" sb.getSuperField "+sb.getSuperField());
}
}
3、无法覆盖静态方法
如果某个方法是静态的,它的行为就不具有多态性。