2010-12-06 5 views
3

Привет, ребята, у меня чертовски время с проблемой «расширений» с проблемой в задаче, над которым я работаю, - я думаю, что у меня только блок, потому что он написан быть целенаправленно запутанным. Вот проблема, как я получил это:Java - Extends issue

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");} 
    ^

и я должен быть в состоянии исправить эту ошибку в классе B, не касаясь класса A. Мне явно не хватает чего-то глупого очевидного, но я пробовал перестановки всего, о чем я могу думать в течение часа, и ничего не работает.

До сих пор я пытался:

  • бросает пустоту перед B() - та же ошибка.
  • создание B() в A (int a) - последнее возвращается с ошибкой объявления недопустимого метода (добавление пустоты перед ним возвращает меня обратно к исходной ошибке «не может найти символ»)
  • создание B() B (int a) - та же ошибка, плюс добавляет дополнительную ошибку «не удается найти символ», так как теперь я уничтожил объявление B().
  • создание класса B продолжается A в класс B продолжается A (int A) - выбрасывает девять ошибок. Понятно, что не ответ.
  • Изменение имени класса A на Apple просто для того, чтобы узнать, даст ли мне ответ - это требует от меня добавить пустоту перед A (int a) в классе Apple, чего я не могу сделать.

Какого черта я здесь не хватает? Это не совсем продвинутый класс, поэтому не может быть ничего сложного, но это делает меня совершенно безумным. Любая помощь будет принята с благодарностью.

ответ

5

В производном классе вам нужно вызвать конструктор базового класса. Если вы не сделаете это явно, компилятор попытается вставить вызов конструктору без аргумента - если в базовом классе не существует, вы получите эту ошибку.

Решения явно вызвать конструктор базового класса с некоторым значением:

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

вы избили меня на 45 секунд :) – 2010-12-06 03:23:42

+0

А-Я помню, я пробовал делать это как супер (а), и он бросил ошибка, вероятно, потому, что я фактически не определял. Спасибо! – BigE 2010-12-06 03:27:57

+0

@BigE: Пожалуйста, отметьте этот ответ как правильный, установив флажок рядом с ним слева. Благодарю. – Asaph 2010-12-06 05:20:23

0

Класс А не имеет конструктора по умолчанию, потому что вы не написали один (но ты написать один, который принимает Int параметр).

Класс B имеет конструктор по умолчанию no-arg. Он должен быть вызван конструктором суперкласса, но он не может, потому что в классе А. нет такой вещи.

+0

Да, я так понял, но я пытался выяснить, как обойти эту проблему - у Анона есть решение, которое сработало. Благодаря! – BigE 2010-12-06 03:30:17

2

Ваш первый вызов в конструкторе B должен быть супер (a); существо, которое вы хотите ввести в конструктор B.

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.

Смежные вопросы