下面是一个简单的例子。我有两个抽象类,A
和B
,一个具体的类C
,其中包括抽象方法。
当我创建新的C
时,我希望看到A
和B
的构造函数被调用。知道他们为什么不被召唤?
//Q.java
class Q {
abstract class A {
A() {
System.out.println("in A");
}
public abstract void sayHi();
}
abstract class B extends A {
B() {
super();
System.out.println("in B");
}
}
class C {
C() {
super();
System.out.println("in C");
}
public void sayHi() {
System.out.println("Hi!");
}
}
Q() {
C Ccc = new C();
}
public static void main(String[] args) {
Q z = new Q();
}
}
答案 0 :(得分:6)
因为c
的超类是Object
其他类名以大写字母A,B,C,etc
如果您想同时看到调用的a
和b
,请执行以下操作:
class c extends b
答案 1 :(得分:3)
您的班级c
不会延伸课程b
或a
,因此无法使用super()
调用其构造函数并调用Object
构造函数
试试这个:
class c extends b {
public c(){
super();
//...
}
}
答案 2 :(得分:2)
你应该扩展类c
中的抽象类。
class c extends b {
没有明确地延伸b
,它等同于
class c extends Object {
,因此调用super
调用Object
构造函数。
答案 3 :(得分:2)
只需:
class c extends b{
它现在可以工作..你还没有扩展b ...
答案 4 :(得分:2)
请参阅,我们有超类Object,所有类都隐式扩展。所以,如果我们有
public class A{}
那相当于写作
public class A extends Object{}
。
但是如果你想扩展自己的另一个类,那么你必须明确地提到它
public class B extends A{}
否则java会将Object视为您的超类。 (注意:即使是这种情况,Object也是'B'的超类,但这是因为它是'A'的超类,因此是'B'。因此,如果你没有明确提到'B extends A',那么B类将把Object作为唯一的超类。
更多的你不需要在子类构造函数中提到super()。这也是隐含的。
答案 5 :(得分:1)
C
和B
无论如何都不相关。默认情况下,C的超类是java.lang.Object
C
应扩展B
,如
class C extends B{ .. }
在这种情况下,它将调用超类构造函数。
此外,您无需明确调用super()
,因为它隐含在那里。