📜  门| GATE 2017 MOCK II |问题 37(1)

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

门 | GATE 2017 MOCK II |问题 37

问题描述

在GATE 2017 MOCK II中,有一个与程序员有关的问题,编号为37。本问题涉及一个编程问题,需要针对给定的代码进行分析和修改。以下是问题的详细描述:

class A {
    public void print() {
        System.out.pirntln("Class A");
    }
}

class B extends A {
    public void print() {
        System.out.println("Class B");
    }
}

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

请根据上述提供的代码完成以下任务:

  1. 分析并解释正确输出的结果。
  2. 修改代码以使得它输出 "Class A" 两次。
解析与任务一

上面给出的代码段涉及了继承和多态的概念。根据Java中的多态性,当子类对象引用赋值给父类引用时,可以运行时绑定(以父类方法为名称的方法),这表示在运行时会根据对象类型调用相应的方法。

main方法中,我们首先创建了一个A类的对象obj1,然后创建了一个B类的对象obj2。接着分别调用两个对象的print方法。

对于obj1.print(),由于obj1的编译时类型是A,所以它调用的是A类中的print方法。因此,输出结果为 "Class A"。

对于obj2.print(),由于obj2的编译时类型是A,但其运行时类型是B,所以它会调用B类中重写的print方法。因此,输出结果为 "Class B"。

解析任务一的结果是 "Class A" 和 "Class B"。

任务二

要使代码输出 "Class A" 两次,我们需要修改B类的print方法。我们可以手动添加一个新的A类实例,并在print方法中调用其print方法。

class B extends A {
    public void print() {
        super.print();
        System.out.println("Class B");
    }
}

B类的print方法中,我们首先使用super.print()调用父类的print方法,这将输出 "Class A"。然后,我们输出 "Class B"。这样就可以实现输出 "Class A" 两次的要求。

修改后的代码如下所示:

class A {
    public void print() {
        System.out.println("Class A");
    }
}

class B extends A {
    public void print() {
        super.print();
        System.out.println("Class B");
    }
}

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

输出结果为:

Class A
Class A

这就是修改后的代码输出 "Class A" 两次。

希望上述信息能对你有所帮助。请记得使用Markdown格式返回结果。