Фактические вопросы о Java - PullRequest
2 голосов
/ 03 мая 2009

Мой учитель недавно сдал практический экзамен по Java, и мне любопытно посмотреть, как я поступил с правдой / ложью. Я наименее уверен в номер один, поэтому любое объяснение здесь очень поможет.

  1. В Java класс может расширять любое количество абстрактных классов.

    ложь. Я не совсем понимаю, почему, только потому, что в наследующем классе родительские классы могут вызвать конфликт?

  2. В Java запрещено передавать параметр, тип которого является абстрактным классом.

    Ложь, абстрактные классы даже не имеют конструкторов ...

  3. В Java абстрактный класс может иметь любое количество подклассов.

    True. Я не могу придумать ничего, что могло бы ограничить это.

  4. В Java нет ограничений на количество интерфейсов, которые может реализовать класс.

    True

  5. Невозможно реализовать стек в виде двусвязного списка, поскольку стеку требуется доступ только к одному концу списка, а двусвязный список обеспечивает доступ к обоим концам списка.

    верно. но это было бы не очень эффективно.

Ответы [ 5 ]

7 голосов
/ 03 мая 2009

1) Это неверно, поскольку Java не поддерживает множественное наследование. Класс может расширять только один класс, является ли он абстрактным или нет. Он может транзитивно расширять несколько классов (например, он расширяет B, который расширяет C, поэтому косвенно он также расширяет C). Класс может реализовывать несколько интерфейсов. Существует множество причин, по которым Java не поддерживает множественное наследование, но поддерживает множественные интерфейсы, поэтому это лучше во многих отношениях.

2) Прежде всего, абстрактные классы могут иметь конструкторы. Утверждение ложно, потому что вам разрешено передавать абстрактные типы в качестве параметров. Из-за полиморфизма вы будете передавать конкретный подтип, который вы уже создали.

3) Это правда

4) Это в некоторой степени верно (есть некоторые ограничения в реализации JVM, но вы никогда не достигнете этого на практике)

5) Вы можете легко реализовать стек в виде двусвязного списка, это хорошее упражнение. Это даже эффективно, так как вы все еще делаете все за O (1).

3 голосов
/ 03 мая 2009

1) Правильно. Java (как и C #) отклонил множественное наследование реализации, в основном по причинам сложности, как я считаю.

2) Полу-правильно: фактический ответ был правильным (ложно; вы, конечно, можете объявить параметры, переменные и т. Д. Абстрактных классов), но ваши рассуждения неверны (и я подозреваю, что вы имели в виду "истина" было бы совершенно неправильно). Абстрактные классы могут иметь конструкторы, которые вызываются производными классами. Кроме того, конструкторы не имеют никакого отношения к тому, может ли тип параметра быть абстрактным классом.

3) Правильно.

4) Правильно.

5) Ну, вы ошибаетесь в том, что это возможно возможно (тогда как вы утверждали, что это правда, что не возможно). Тот факт, что реализация имеет доступ к обоим концам списка, не означает, что она должна выставлять оба конца.

1 голос
/ 03 мая 2009

1) - false, потому что в Java «extends» - это особая операция, которая наследует как все структуры данных, так и реализацию всех методов. В Java класс может расширять только один суперкласс. однако в Java вы можете реализовать любое количество интерфейсов , которые только "вводят" имя и подпись функций, которые вы должны реализовать.

Причиной этого является то, что расширенные множественные базовые классы - которые называются «множественным наследованием» - считаются запутанными. Это немного вопрос религиозной войны; C ++ поддерживает множественное наследование, Java и Smalltalk - нет, а Ruby вместо этого позволяет смешивать модули с тем же эффектом, что и множественное наследование.

2) Вы МОЖЕТЕ передать что-то как абстрактный класс. Рассмотрим, например, абстрактный класс Shape с конкретными подклассами Circle, Square и Triangle. Все они являются «разновидностями» формы, поэтому вы передаете Shape любой операции, которая должна работать для всех.

3) Единственная перестройка в том, что вы можете сделать класс финальным, что не позволяет подклассам. Не имеет смысла делать абстрактный класс финальным; Вы никогда не сможете его использовать.

4) Да, и вот как вы избавляетесь от необходимости иметь возможность расширять несколько классов; Интерфейсы - это способ получить что-то вроде множественного наследования.

5) Конечно, возможно реализовать стек в виде двусвязного списка. Более того, в определенных ситуациях вы бы хотели. Рассмотрим, к примеру, что-то, что вы хотели бы иметь возможность отображать весь стек, не нарушая его. Тогда может быть полезно расширить этот стек неразрушающей операцией «показать все». В стеке, реализованном в связанном списке, вы можете «пройтись» по всему списку и «пройтись» обратно к голове.

1 голос
/ 03 мая 2009
  1. Java имеет одиночное наследование; класс может наследовать от одного родительского класса, абстрактного или нет. Конечно, вы можете иметь цепочку из нескольких классов, наследуемых друг от друга, например, abstract A -> abstract B -> C.
  2. Неверно, но проблема конструктора не имеет к этому никакого отношения. Передача аргумента, тип которого ограничен типом абстрактного класса, гарантирует интерфейс для входящих объектов и является фундаментальным принципом полиморфизма.
  3. True. Абстрактные классы имеют тенденцию определять частичные реализации интерфейса, поэтому, как правило, было бы пустой тратой времени только на одну реализацию.
  4. True.
  5. Ложь, конечно? Вы можете просто нажать / выскочить с одного конца, игнорируя обратную ссылку.
0 голосов
/ 03 мая 2009

1: Это неверно, потому что в Java вы просто не можете расширять несколько классов.

2: я думаю, что вы не правы: Абстрактные классы могут иметь конструктор!

3: Верно, вы правы. Абстрактный класс даже не "знает", получает ли он подкласс.

4: Правда, вы правы, есть только теоретический предел (ничто на компьютерах не ограничено).

5: Я думаю, что вы неправильно поняли вопрос: Если у вас есть Двойной список, вы можете фактически взять его и сделать из него стек . В списке вы можете получить первый элемент, чтобы использовать этот метод для реализации стека

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