Это чистая ООП, поэтому, пожалуйста, не займет много времени, чтобы думать об этом, пока вы действительно поняли это.
Ответы на вопросы:
У меня возникли проблемы, потому что я думаю, что, поскольку в классе лодок, цвет является частным, так экземпляр Kayak не имеет цвет, связанный с ним. Это правда?
Нет, это неправильно. Согласно UML, лодка имеет цвет. Это «свойство» можно увидеть с помощью геттера getColor
и сеттера setColor
. Частное поле - это только деталь реализации, что не имеет значения. Поскольку Каяк простирается (происходит от) Лодка, можно сказать, что Каяк - это лодка. Это называется подтипированием. Кроме того, Kayak наследует код от Boat, а также наследует цвет свойства. Итак, у каяка также есть цвет.
Кроме того, когда вступает в игру тот факт, что класс лодки является абстрактным, как это влияет на каяк?
На самом деле не имеет значения, является ли суперкласс абстрактным или нет, при его расширении.Важно следующее: если ваш суперкласс абстрактен и содержит абстрактные методы, а ваш подкласс не является абстрактным, то ваш подкласс должен обеспечивать реализации абстрактных методов.
Пока что в вашем классе лодки нет абстрактных методов. Так что для расширения (Каяк простирается на лодке) не имеет значения, что Лодка абстрактна. На самом деле это имеет значение при рассмотрении примерных выражений.
И, наконец, имеет ли экземпляр класса «Лодка» связанные с ним numSeats?
Этот вопрос содержит ошибку: не может быть объектов класса Лодка. Просто потому, что класс Boat является абстрактным. Вы не можете создавать экземпляры абстрактных классов!
Класс Kayak не является абстрактным. Таким образом, вы можете создавать экземпляры из него. У экземпляров каяка есть несколько мест. Но, поскольку у вас могут быть другие классы, расширяющие Лодку, у которых нет места, вы не можете сказать, что у всех лодок будет несколько мест.
Кстати: Вы можете ответить на вопрос, какие выражения действительны? Не могли бы вы опубликовать свои ответы и причины?
Я хочу сказать, что первые два не будут работать, потому что Лодка абстрактна. Третий и четвертый будут работать, потому что каяк IS A Boat, поэтому его можно установить как класс лодки с параметрами байдарки, и, очевидно, каяк - это байдарка. Последний не будет работать, так как такого конструктора нет.
Этот ответ верный, но мы должны работать над вашей формулировкой.
поэтому он может быть установлен как класс Лодка с Kayak параметры
байдарка не может «быть установлен как класс Boat». Давайте рассмотрим выражение
Boat boat3 = new Kayak(Color.yellow, 30.2, 1, 1);
Вы создаете экземпляр Kayak, вызывая конструктор Kayak, который принимает цвет, двойной, и два целых числа (кстати: это единственный конструктор). Затем вы назначаете ссылку этого нового экземпляра Kayak на переменную boat3, которая имеет тип Boat. Заметьте, что я говорю о типе здесь, а не о классе. Как мы уже упоминали, каяк - это лодка, это задание верно.
Эта концепция ООП называется политипом подтипа: переменная типа Лодка может ссылаться на любую Лодку, а также подтипы ее. (В этом случае он должен быть подтипом, так как Лодка является абстрактной)
Просто для уточнения формулировок: Подклассификация означает только технический процесс расширения класса. Это также означает наследование кода суперкласса. Подтипирование означает отношение a-a-a (каяк - это лодка) и является ключом к полиморфизму подтипов. В Java подклассификация всегда также является подтипированием.
Где он говорит, что судно является абстрактным? – BevynQ
Класс лодок выделен курсивом - символизм для абстрактного. – user3089390