Java - 继承问题

3

我在做一个问题集时遇到了一个名为“extends”的问题 - 我认为这是一个故意混淆人的问题,所以我很苦恼。以下是我得到的问题:

class A {
    int x;
    A(int a) {System.out.println(" class A");}
}

class B extends A {
   int x;
   B() {System.out.println(" class B");}
   public static void main (String [] args) {
    A a = new B();
    }
}

当我进行编译时,从控制台中出现了以下错误:

cannot find symbol
symbol  : constructor A()
location: class A
   B() {System.out.println(" class B");}
       ^

我应该能够在不修改类A的情况下解决类B中的错误。但是很明显,我漏掉了某些非常显而易见的东西,已经尝试了各种组合一个小时了,但都没有效果。

到目前为止,我尝试过:

  • 在B()前面加一个void - 仍然报错。
  • 将B()改成A(int a) - 后者会返回无效的方法声明错误(在其前面添加一个void会将我带回原始的“找不到符号”错误)。
  • 将B()改成B(int a) - 同样的错误,还会导致额外的“找不到符号”错误,因为我现在摧毁了B()的声明。
  • 将类B extends A更改为类B extends A(int A)- 报告了9个错误。 显然这不是答案。
  • 将类A的类名更改为苹果,只是想看看是否会给我答案 - 这要求我在Apple类中添加void在A(int a)前面,而我不能这样做。

我到底漏掉了什么?这不是一个特别高级的课程,所以不可能是什么复杂的问题,但这让我变得完全疯狂。 希望有人能帮我,非常感谢。

4个回答

5
在派生类中,您需要调用基类构造函数。如果您没有明确执行此操作,则编译器将尝试插入对无参数构造函数的调用 - 如果在基类中不存在,则会出现错误。
解决方案是使用某些值显式调用基类构造函数:
B() {
    super(0);
    System.out.println(" class B");
}

啊 - 我记得我试过用 super(a) 做这个,但它抛出了一个错误,可能是因为我实际上没有定义 a。谢谢! - BigE
@BigE:请在左侧的复选框旁边点击它,将这个答案标记为正确。谢谢。 - Asaph

2

B的构造函数中第一次调用需要是super(a),其中a是你想要输入到B的构造函数中的任何内容。


是的 - (a) 必须是一个实际的整数,因为在我发布之前,我尝试使用变量来完成它,但那并没有起作用,我认为那是错误的道路。糟糕! :) - BigE

1

1) 当你扩展一个类时,你的子类隐式地包含了一个数据块,其中包含用于创建超类实例的所有数据。你也必须初始化这些数据。如果你没有指定如何初始化,那么默认构造函数 A.A() 将被调用。但是这个构造函数并不存在 - 你只有 A.A(int)

为了进行这个初始化,在 B 构造函数的第一行,你需要使用特殊语法调用 A 构造函数,如下所示:

B() {
    super(42); 
    // because we are calling the constructor that takes an int, we must supply
    // one. It's up to you to figure out what values should be supplied. Maybe 
    // you wanted to take an int in the B constructor, and pass it along?
    System.out.println(" class B");
}

2) 在类A和类B中都声明了一个int x;。这可能不是你想要的。正如所指出的,每个B实例已经包含了一个int x - 这是因为B继承了A。


这只是一个清除错误的练习,所以提供任何int都可以正常工作,不会影响控制台输出。谢谢! - BigE

0

类A没有默认构造函数,因为您没有编写一个(但是您编写了一个带有int参数的构造函数)。

类B具有无参默认构造函数。它需要调用超类构造函数,但是它无法这样做,因为类A中不存在这样的构造函数。


是的,我已经发现了这一点,但我正在尝试找出如何避开这个问题 - Anon.的帖子提供了可行的解决方案。谢谢! - BigE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接