📅  最后修改于: 2023-12-03 14:58:31.276000             🧑  作者: Mango
这是一道 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();
}
}