来自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“); “显式定义的构造函数?我哪里错了?
我在这里看到了这个问题,但并没有真正理解答案。
答案 0 :(得分:2)
隐式调用尝试在没有参数的情况下调用super
。 Top
没有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(" ");
}
}