Java - расширяет проблему - PullRequest
       0

Java - расширяет проблему

3 голосов
/ 06 декабря 2010

Эй, ребята, у меня чертовски много времени с проблемой "расширений" с проблемой в наборе задач, над которым я работаю - я думаю, что у меня просто есть блок, потому что он написан, чтобы целенаправленно сбивать с толку , Вот проблема, как мне было сказано:

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) - последний возвращается с ошибкой объявления недопустимого метода (добавление пустоты перед ним возвращает меня к исходной ошибке «not find symbol»)
  • выполнение B () B (int a) - та же ошибка, плюс добавляется дополнительная ошибка «не удается найти символ», поскольку я теперь уничтожил объявление B ().
  • создание класса B расширяет A до класса B, расширяет A (int A) - выбрасывает девять ошибок. Явно не ответ.
  • Изменение имени класса A на Apple, просто чтобы посмотреть, даст ли это мне ответ - нужно, чтобы я добавил пустоту перед A (int a) в классе Apple, что я не могу сделать.

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

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010

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

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

B() {
    super(0);
    System.out.println(" class B");
}
2 голосов
/ 06 декабря 2010

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

1 голос
/ 06 декабря 2010

1) Когда вы расширяете класс, ваш подкласс неявно содержит порцию данных, которая состоит из всех данных, используемых для создания экземпляра суперкласса.Вы также должны инициализировать эти данные.Если вы не говорите, как он будет инициализирован, предполагается, что вам нужен конструктор по умолчанию, то есть A.A().Но этот конструктор не существует - у вас есть только A.A(int).

Чтобы выполнить эту инициализацию, в качестве первой строки в конструкторе B вы вызываете конструктор A со специальным синтаксисом следующим образом:1005 *

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.

0 голосов
/ 06 декабря 2010

Класс A не имеет конструктора по умолчанию, потому что вы его не написали (но вы написали тот, который принимает параметр int).

Класс B имеет конструктор по умолчанию без аргументов. Он должен вызывать конструктор суперкласса, но не может, потому что в классе A такого нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...