📅  最后修改于: 2023-12-03 15:28:43.357000             🧑  作者: Mango
这道题目是GATE-CS-2007考试的一个问题,考察了程序员的编程思想和技能。让我们来看看这个问题是什么,以及如何解决它。
考虑下面的程序:
class X {
public void m1 () {
System.out.println ("Xm1");
}
public void m2 () {
System.out.println ("Xm2");
}
}
class Y extends X {
public void m1 () {
System.out.println ("Ym1");
}
}
class Z extends Y {
public void m2 () {
System.out.println ("Zm2");
}
}
public class MainClass {
public static void main (String[] args) {
X a = new Y ();
X b = new Z ();
Y c = new Z ();
a.m2 ();
b.m1 ();
c.m2 ();
}
}
这个程序的输出是什么?
我们可以按照下面的方法来解决这个问题:
先来看看每个对象的类型和方法调用的类型:
X a = new Y (); // 对象类型:Y,方法类型:X
X b = new Z (); // 对象类型:Z,方法类型:X
Y c = new Z (); // 对象类型:Z,方法类型:Y
根据Java中的覆盖规则,我们可以确定每个对象实际执行的方法:
a.m2 (); // 执行的是Y类中的m2方法,因为a对象的实际类型是Y
b.m1 (); // 执行的是X类中的m1方法,因为b对象的实际类型是Z,而Z没有覆盖m1方法
c.m2 (); // 执行的是Z类中的m2方法,因为c对象的实际类型是Z,而Z覆盖了Y中的m2方法
根据上面的分析,我们可以输出每个方法实际执行的内容:
Ym2
Xm1
Zm2
因此,程序的输出为:
Ym2
Xm1
Zm2
我们通过以上步骤,成功地解决了这个问题。这个问题考察了程序员对Java类的继承和覆盖规则的理解。在编写Java程序时,我们需要深入理解这些规则,并且注意不同类型的对象实际执行的方法可能不一样。