1

来自贝茨和塞拉:

class Top {
    public Top(String s) {
        System.out.print("B");
    }
}

public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.print("D");
    }

    public static void main(String[] args) {
        new Bottom2("C");
        System.out.println(" ");
    }
}

选择是:

A、BD

B、数据库

C. BDC

D. DBC

E. 编译失败

回答:

® ✓ E 是正确的。Bottom2 的构造函数中隐含的 super() 调用无法满足,因为 Top 中没有无参数构造函数。仅当类没有明确定义的构造函数时,编译器才会生成默认的无参数构造函数。

但我很困惑。不是“public Top(String s) { System.out.print("B"); } ” 明确定义的构造函数?我哪里错了?

我在这里看到了这个问题,但并没有真正理解答案。

4

5 回答 5

2

隐式调用尝试super不带参数调用。Top没有无参数构造函数,因此调用super试图调用不存在的方法。当你想调用一个非无参数的构造函数时,你需要显式地调用它。Bottom2的构造函数应该调用super(s)调用Top的 1-arg 构造函数。

于 2013-10-25T01:36:15.087 回答
1

是的,这个构造函数是在基类中定义的。但是您还必须从子类中调用它。

在每个子类构造函数中,都必须调用基类构造函数。唯一的例外是如果有一个没有参数的基类构造函数。默认情况下调用此构造函数。

这意味着您的代码应如下所示:

public Bottom2(String s) {
    super(s);
    // ...
}

作为替代方案,您可以Top()在基类中添加一个构造函数。

于 2013-10-25T01:38:25.287 回答
0

每当您编写自己的参数化构造函数时,它都会替换 Java 提供的默认构造函数,除非您再次自己定义无参数构造函数。

现在,在 中Top,有一个参数化构造函数,并且默认的无参数构造函数消失了,除非您明确定义一个。因此,仅仅调用是super()行不通的。您需要传入一个String参数并调用super(string).

尝试为类编写一个默认构造函数Top,然后调用该类。它不会闪烁该错误=) super()Bottom

尝试这个:

class Top {
    public Top() { System.out.println("No-arg constructor in Top"); }
    public Top(String s) {
        System.out.print("B");
    }
}

public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.print("D");
    }

    public static void main(String[] args) {
        new Bottom2("C");
        System.out.println(" ");
    }
}
于 2013-10-25T01:37:49.850 回答
0

但我很困惑。不是“public Top(String s) { System.out.print("B"); } ” 明确定义的构造函数?我哪里错了?

public Top(String s) 是显式定义的构造函数。正如正确答案所说,只有当类没有明确定义的构造函数时,编译器才会生成默认的无参数构造函数

于 2013-10-25T02:04:11.367 回答
0

解决方案 1.您正在创建基类的对象 new Bottom2() 并将参数作为字符串“C”传递,然后根据调用,调用 get 到 Bottom2(String s) 构造函数并打印“D”。

2. 同时,Bottom2() 扩展了 Top 类,因此“B”需要打印,但 Top(String s) 构造函数具有字符串作为参数,并且在主类中没有参数传递给 Top(String s) 构造函数。

3. 那为什么编译器给我们一个错误

4.下面给出这个问题的解决方案

    class Top {
    public Top() {
        System.out.println("B");
    }
}
public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.println("D");
    }
public static void main(String args[]) {
        new Bottom2("C");
        System.out.println(" ");
    }
}
于 2015-08-02T04:33:12.610 回答