面向对象集|每日一题:下列代码的输出结果是什么?

330 阅读2分钟

下列代码的输出结果是什么?( )

public class C extends B {
    public C() {
        System.out.print("C");
    }

    public static void main(String[] args) {
        C c = new C();
    }
}

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

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

A. C

B. CBA

C. BC

D. ABC


解析: 本道题主要考察的是子类在创建对象时的构造方法调用问题。

上方的代码如果简单调整一下,相信大家看的会更容易一些:

public class C extends B {
    public C() {
        super();
        System.out.print("C");
    }

    public static void main(String[] args) {
        C c = new C();
    }
}

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

class A {
    public A() {
        super();
        System.out.print("A");
    }
}

我们都知道 在子类创建对象时,都会先调用父类的构造方法 ,哪怕不添加 super() 依然会隐式进行调用,所以这道题,就是要从这点来着重分析。

另外,看这种题一定要先去看 main 方法,因为 main 方法是程序的入口,从入口开始,像 debug 一样在脑海里一步步的去调试程序。

首先,我们看到 main 方法是在 C 类中,里面只有一行代码,这行代码就是在通过无参构造方法创建 C 类的对象。那接着我们肯定就要去看 C 类的无参构造方法。

C 类是继承自 B 类的,而且 C 类无参构造方法中没有指定调用父类(B类)的哪个构造方法,那默认就是会调用父类(B类)的无参构造方法。

然后去看看 B 类的无参构造方法,里面也如 C 类一样,没有指定调用父类(A类)的哪个构造方法,那默认也是调用父类(A类)的无参构造方法。

最后,我们看一下 A 类的无参构造方法,依然是和 B、C 一样,但这时候因为它没有显式指定父类,所以它的父类就是 Object 类,调用 Object 类的无参构造方法不会产生任何输出,可以忽略掉。

于是, A 类的构造方法中输出了一个 A,随后 B 类的构造方法中输出了一个 B、再之后 C 类的构造方法中输出了一个 C。因为都是使用的 print() 方法来输出,所以输出后没有换行,结果就是 ABC