对调用默认值感到困惑,没有arg构造函数

时间:2013-10-25 01:33:24

标签: java

来自Bates和Sierra:

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(" ");
    }
}

选择是:

一个。 BD

B中。 DB

℃。 BDC

d。 DBC

电子。编译失败

答案:

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

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

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

5 个答案:

答案 0 :(得分:2)

隐式调用尝试在没有参数的情况下调用superTop没有no-arg构造函数,因此对super的调用试图调用一个不存在的方法。如果要调用非无参数构造函数,则需要显式执行。 Bottom2的构造函数应该调用super(s)来调用Top的1-arg构造函数。

答案 1 :(得分:0)

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

现在,在Top中,有一个参数化构造函数,默认的no-arg构造函数已经消失,除非您明确定义一个。因此,仅调用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(" ");
    }
}

答案 2 :(得分:0)

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

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

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

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

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

答案 3 :(得分:0)

  

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

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

答案 4 :(得分:0)

解 1.你正在创建基类的对象,它是新的Bottom2()并将参数作为字符串传递给“C”然后根据调用,调用get to Bottom2(String s)构造函数并打印“D”。

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

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(" ");
    }
}