面试题58
2018年1月11日
本期题目
(单选题)下列程序输出结果是什么。?
public class Test1 {
public static void main(String[] args) {
Father f = new Father();
Father c = new Child();
System.out.println(f.getName());
System.out.println(c.getName());
}
}
class Father {
public static String getName() {
return "Father";
}
}
class Child extends Father {
public static String getName() {
return "Child";
}
}
A Father Father
B Father Child
C 编译失败
D 以上答案都不对
考点:考察求职者对Java方法参数传递特性的理解
出现频率:★★★★★
【面试题分析】
因为这两个getName方法是静态方法,所以在内存中的地址空间是固定的,根本不存在冲突的问题。也就是说,这两个方法在内存中占用了不同的空间,而具体执行哪一个,则要看是由哪个类来调用的,因为是静态方法,而且两个引用都是Father的所以只会调用Father的方法。
所以参考答案是 (A)
扩展知识:本题容易混淆,有些读者想当然选择Father Child 的输出结果(覆盖),如果是这样的结果,代码应进行如下修改
public class Test1 {
public static void main(String[] args) {
Father f = new Father();
Father c = new Child();
System.out.println(f.getName());
System.out.println(c.getName());
}
}
class Father {
//跟上面相比把static去掉
public String getName() {
return "Father";
}
}
class Child extends Father {
//跟上面相比把static去掉
public String getName() {
return "Child";
}
}