我知道以下内容并不奏效,但您能帮我理解原因吗?
class A {
A(int x) {
System.out.println("apel constructor A");
}
}
class B extends A {
B() {
System.out.println("apel constructor B");
}
}
public class C {
public static void main(String args[]) {
B b = new B();
}
}
答案 0 :(得分:4)
您的类A
使用显式参数构造函数,因此默认的no-args构造函数不会隐式存在。
要让您的班级B
成功延长A
,您需要:
A
super(some int)
作为B
构造函数的第一行考虑子类的构造函数隐式调用super()
。
答案 1 :(得分:4)
每个构造函数(Object
除外)必须链接到另一个构造函数,这是它的第一件事。那是使用this(...)
或super(...)
。
如果没有指定任何内容,构造函数会隐式地将super()
添加到超类中无参数构造函数的链中。迟早,您需要遍历继承层次结构的每个级别的构造函数。这确保了对象的状态基本上从每个角度都是有效的。
在你的情况下,你没有在A
中拥有无参数构造函数,因此B
无法编译。要解决此问题,您需要向A
添加无参数构造函数,或者明确链接到A
中的参数化B
构造函数:
public B() {
super(0); // Or whatever value you want to provide
}
有关详细信息,请参阅JLS section 8.8.7。
答案 2 :(得分:2)
您必须在子类Constructor中调用超类构造函数。
B是子类,它继承了超级A的行为。因此,当您创建B的实例时,B&#39的构造函数应该调用超类构造函数。
B() {
super(1); // or super()
System.out.println("apel constructor B");
}
答案 3 :(得分:2)
这不起作用,因为如果类A
没有声明默认构造函数,则必须显式调用超类A
的一个构造函数。
答案 4 :(得分:2)
它没有编译,因为你还没有为A定义一个默认构造函数,B构造函数正在调用它。
答案 5 :(得分:2)
每次扩展一个类时,您调用的类的构造函数都将被调用(超级构造函数)。如果你声明一个构造函数,它将覆盖隐式构造函数,如果该构造函数有参数,那么扩展它的类将无法调用隐式构造函数,因此你必须显式调用构造函数。
示例:
B() {
super(0);//integer value
System.out.println("apel constructor B"); }
}
答案 6 :(得分:2)
当您调用class' B的构造函数时,您应该声明您希望父类构造函数也被调用 e.g。
class B extends A{
B(){
super(0);
}
B(int i){
super(i);
}
}
这些构造函数中的任何一个都应该没问题
答案 7 :(得分:1)
每当在Java中调用子类的构造函数时,它首先会自动调用其超类的构造函数。始终首先执行Super类的构造函数,然后执行Sub类的构造函数。 在这种情况下,Super class Constructor在调用时需要一个整数参数,而代码不提供该参数。你可以试试这个:
class B extends A
{
B()
{
super(5);
System.out.println("apel constructor B");
}
}
答案 8 :(得分:1)
我用两种方式解决你的问题: -
B类延伸A { B(int x){super(x); System.out.println(“hello second constructor”);} public static void main(String args []){B b = new B(10);}} 2。
B级扩展A { B(){super(任意int值); System.out.println(“hello second constructor”);} public static void main(String args []){B b = new B(10);}}