要强调的是,多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.
这里讨论的是static方法不能发生多态.值得注意的是,所谓的static方法不能多态指的是:override的方法本身是不是static的,而不是指调用override方法的方法是不是static的!
比如以下程序:
class
Father
...
{
public void act() ...{
System.out.println("Father.act()");
}
}
class Son extends Father ... {
public void act() ...{
System.out.println("Son.act()");
}
}
public class Test ... {
public static void test(Father i) ...{
i.act();
}
public static void main(String[] a)...{
Son son = new Son();
test(son);
}
}
public void act() ...{
System.out.println("Father.act()");
}
}
class Son extends Father ... {
public void act() ...{
System.out.println("Son.act()");
}
}
public class Test ... {
public static void test(Father i) ...{
i.act();
}
public static void main(String[] a)...{
Son son = new Son();
test(son);
}
}
输出结果为:Son.act(),如果static不能多态,那结果不就应该是Father.act()吗?
其实,就象上面说的.我们要考虑的是的act()方法是不是static,有没有多态,而不是调用的方法test()是不是static的.
这跟test方法是否static无关,若把两个act方法都修改成static,则输出结果就是Father.act(),因为static方法不能多态.