不定项选择题
有以下程序:
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中,可以用一个子类的实例实例化父类的一个变量,而变量在编译时是一个父类实例,在运行时可能是一个子类实例。