不定项选择题 有以下程序:
   1)class  Person  {
   2)public void printValue(inti,  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)Persorn t=new Teacher();
   10)t.printValue(10);
   11)}
   12)}
   第10行的声明将调用的方法______。
   A.on line 2    B.on line 3    C.on line 6 D.on line 7
【正确答案】 D
【答案解析】变量t是一个Person对象,但是它是用Teacher实例化的,这个问题涉及到Java编译时多态和运行时多态的问题。就编译时多态来说,t实际上是一个Person类,这涉及到类型的自动转换(将一个子类的实例赋值给一个父类的变量时不用进行强制类型转换,反之则需要进行强制类型转换,而且被赋值的变量实际上应该是一个子类的对象),如果对t调用了子类中新增的方法则造成编译时错误,编译将不能通过。而在运行时系统将根据t实际指向的类型调用对应的方法。对于本例来说,t.print(10)将调用t实际指向的Teacher类的对应方法。在Java中,可以用一个子类的实例实例化父类的一个变量,而变量在编译时是一个父类实例,在运行时可能是一个子类实例。