Java - 扩展问题

时间:2010-12-06 03:19:12

标签: java 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()前面抛出一个空洞 - 同样的错误。
  • 将B()转换为A(int a) - 后者返回时出现无效的方法声明错误(在它前面添加一个void,将我踢回原来的“找不到符号”错误)
  • 制作B()B(int a) - 同样的错误,再加上一个额外的“找不到符号”错误,因为我现在已经删除了B()声明。
  • 使B类扩展A到B类扩展A(int A) - 抛出9个错误。显然不是答案。
  • 将A的类名更改为Apple只是为了看看是否能给我一个答案 - 这要我在Apple类的A(int a)前添加一个空格,这是我无法做到的。

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

4 个答案:

答案 0 :(得分:5)

在派生类中,您需要调用基类构造函数。如果你没有明确地这样做,编译器将尝试插入对无参数构造函数的调用 - 如果基类中不存在,则会出现该错误。

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

B() {
    super(0);
    System.out.println(" class B");
}

答案 1 :(得分:2)

你在B的构造函数中的第一次调用需要超级(a); a无论你想输入B的构造函数。

答案 2 :(得分: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.

答案 3 :(得分:0)

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

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