📜  门| GATE-CS-2007 |问题2(1)

📅  最后修改于: 2023-12-03 15:28:43.357000             🧑  作者: Mango

门 | GATE-CS-2007 | 问题2

这道题目是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 ();
  }
}

这个程序的输出是什么?

解决方案

我们可以按照下面的方法来解决这个问题:

  • 分析代码,确定每个对象的类型和方法调用的类型。
  • 根据Java中的覆盖规则,确定实际执行的方法。
  • 输出每个方法实际执行的内容。
分析代码

先来看看每个对象的类型和方法调用的类型:

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程序时,我们需要深入理解这些规则,并且注意不同类型的对象实际执行的方法可能不一样。