例如:
1) class Person {2) public void printValue(int i, int j) {/*…*/ }3) public void printValue(int i){/*...*/ }4) }5) public class Teacher extends Person {6) public void printValue() {/*...*/ }7) public void printValue(int i) {/*...*/}8) public static void main(String args[]){9) Person t = new Teacher();10) t.printValue(10);11) }12) } 变量t是一个Person对象,但是它是用Teacher实例化的,这就涉及到java的编译时多态和运行时多态的问题,就编译时多态来说,t实际上是一个Person类,这涉及到类型的自动转换(将一个子类的实例赋值给一个父类的变量是不用进行强制类型转换,反之则需要进行强制类型转换,而且被赋值的变量实际上应该是一个子类的对象),如果对t调用了子类中新增的方法则造成编译时错误编译将不能通过,而在运行时,运行时系统将根据t实际指向的类型调用对应的方法,对于本例来说,t.print(10)将调用t实际指向的Teacher类的对应方法。在java中,可以用一个子类的实例实例化父类的一个变量,而变量在编译时是一个父类实例,在运行时可能是一个子类实例。

解决方案 »

  1.   

    只有泛型才有编译期多太,所以说目前java没有至于运行期多态,也就是楼上所说的
      

  2.   

    编译多态:在编译时就确定具体的调用。
    例如当多个方法因参数类型及数目的区别而重载时,就可以在编译时确定调用的是那个方法。运行多态:在运行时才确定调用的多态。
    例如:假如B是A的子类,A有一个m方法,B中重写了m方法,那末:
    A a;
    B b = new B();
    a = b;
    a.m();动态多态在运行到a.m()时,才根据A与B的关系确定调用A的m方法还是B的调用方法。