0

下面是一个简单的例子。我有两个抽象类,A一个B具体类,C其中包含抽象方法。

当我创建一个 newC时,我希望看到构造函数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();
    }
}
4

6 回答 6

6

因为超类cObject

其他类名以大写字母开头A,B,C,etc

如果您想同时查看ab调用,请执行以下操作:

class c extends b
于 2013-01-02T12:57:17.973 回答
3

您的类c没有扩展 class bor a,因此它不能使用super()并调用Object构造函数来调用它们的构造函数。

尝试这个 :

class c extends b {
    public c(){
        super();
        //...
    }
}
于 2013-01-02T12:57:14.397 回答
2

您应该从 class 扩展抽象类c

class c extends b {

没有b显式扩展,它等价于

class c extends Object {

并且,因此调用super调用Object构造函数。

于 2013-01-02T12:58:57.997 回答
2

只需:

class c extends b{

它现在可以工作了..你还没有在c中扩展b ..

于 2013-01-02T12:59:02.400 回答
2

看,我们有所有类都隐式扩展的超类 Object。所以如果我们有 public class A{} then 它相当于写作 public class A extends Object{}。但是如果你想扩展你自己的另一个类,那么你必须明确提及它, public class B extends A{} 否则 java 会将 Object 视为你的超类。(注意:即使在这种情况下,Object 也是“B”的超类,但这是因为它是“A”的超类,因此是“B”的超类)。因此,如果您没有明确提及“B 扩展 A”,那么 B 类将拥有 Object 作为其唯一的超类。此外,您不需要在子类构造函数中提及 super() 。这也被隐式调用。

于 2013-01-02T13:23:10.010 回答
1

C并且B没有任何关系。C 的超类java.lang.Object默认是

C应该B

class C extends B{ .. }

在这种情况下,它将调用超类构造函数。

此外,您不需要super()显式调用,因为它隐式存在。

于 2013-01-02T13:28:02.367 回答