3

我正在处理我正在处理的问题集中的一个“扩展”问题——我想我只是有一个障碍,因为它被写成故意混淆。这是给我的问题:

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 类将 A 扩展为 B 类扩展 A(int A) - 引发九个错误。显然不是答案。
  • 将 A 的类名更改为 Apple 只是为了看看这是否会给我一个答案 - 这希望我在 Apple 类的 A(int a) 前面添加一个空白,这是我做不到的。

我到底在这里想念什么?这不完全是一个高级课程,所以它不可能是非常复杂的东西,但这让我完全疯了。任何帮助将不胜感激。

4

4 回答 4

5

在派生类中,您需要调用基类构造函数。如果您没有显式执行此操作,编译器将尝试插入对无参数构造函数的调用 - 如果基类中不存在任何构造函数,则会出现该错误。

解决方案是使用一些值显式调用基类构造函数:

B() {
    super(0);
    System.out.println(" class B");
}
于 2010-12-06T03:22:28.820 回答
2

您在 B 的构造函数中的第一次调用必须是 super(a); a 是您想要输入到 B 的构造函数中的任何内容。

于 2010-12-06T03:23:30.200 回答
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)您int x;在 A 类和 B 类中都有声明。这可能不是您想要的。如前所述,每个 B 实例已经包含一个int x- 因为 B 扩展 A 而自动获得的那个。

于 2010-12-06T03:26:00.167 回答
0

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

B 类有一个无参数的默认构造函数。它需要调用一个超类的构造函数,但它不能,因为类 A 中没有这样的东西。

于 2010-12-06T03:22:33.367 回答