📜  门| GATE-CS-2016(套装1)|问题 17(1)

📅  最后修改于: 2023-12-03 14:58:31.276000             🧑  作者: Mango

问题 17

这是一道 GATE-CS-2016 年的套装1考题。本题要求你对给定的 Java 代码进行分析并回答问题。

问题描述:

假设有以下 Java 类:

class A {
  int i = 10;
  public A() {
    System.out.print("A");
    System.out.print(i);
  }

  public void method1() {
    System.out.print("A.method1");
  }
}

有另一个 Java 类:

class B extends A {
  int i = 20;
  public B() {
    System.out.print("B");
    System.out.print(i);
  }

  public void method1() {
    System.out.print("B.method1");
  }

  public void method2() {
    System.out.print("B.method2");
  }
}

最后,有一个包含 main 方法的类:

class Main {
  public static void main(String[] args) {
    A a = new B();
    a.method1();
  }
}

请问程序的输出是什么?


这道题考察了 Java 的继承机制和多态性质。对于多态,我们可以提一提,对于变量、参数和返回值,Java 中的多态只对方法具有多态性,而对变量则不具有多态性。

首先,在 Main 类的 main 方法中,创建了一个 A 类型的变量 a,并调用了 B 类的无参构造函数,即初始化了一个 B 类的对象,并将其强制转换为了 A 类型。由于 B 类是 A 类的子类,因此可以通过 A 类型调用 B 类的方法。

所以,首先输出的是 BA20。这是因为在调用 B 类的构造函数时,首先调用了父类 A 的构造函数,输出了 A10,然后调用了 B 类的构造函数,输出了 B20

接下来调用 a.method1(),根据多态特性,实际调用的是 B 类中的 method1 方法,输出 B.method1

因此,程序输出为:

A10B20B.method1

因此,本题答案为 A10B20B.method1


参考代码片段如下,其中Java代码块使用markdown格式:

```java
class A {
  int i = 10;
  public A() {
    System.out.print("A");
    System.out.print(i);
  }

  public void method1() {
    System.out.print("A.method1");
  }
}

class B extends A {
  int i = 20;
  public B() {
    System.out.print("B");
    System.out.print(i);
  }

  public void method1() {
    System.out.print("B.method1");
  }

  public void method2() {
    System.out.print("B.method2");
  }
}

class Main {
  public static void main(String[] args) {
    A a = new B();
    a.method1();
  }
}