|
2 / 2 / 0
Регистрация: 03.02.2013
Сообщений: 34
|
|||||||||||||||||||||
Полиморфизм в Java13.12.2013, 00:47. Показов 5651. Ответов 34
Метки нет (Все метки)
Добрый вечер. Изучая полиморфизм в Java натолкнулся на такой пример:
Заранее спасибо
0
|
|||||||||||||||||||||
| 13.12.2013, 00:47 | |
|
Ответы с готовыми решениями:
34
Java наследование и полиморфизм
|
|
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70
|
|
| 14.04.2014, 15:24 | |
|
Здравствуйте.Я тоже новичок. Давайте попробуем вместе разобраться.
По 1-му примеру так происходит потому, что: 1)т.к. метод m1(А а) в классе A принимает класс А и все его производные (в том числе класс B) 2)т.к. происходит восходящее преобразование к типу А, то про метод void m1(B b) из класса С он ничего не знает, перегрузки не происходит и выполняется пункт 1
0
|
|
| 14.04.2014, 16:17 | |||||||||||||||||||||
|
Полиморфизм - это однообразная обработка разнотипных данных. Полиморфизм - непосредственная часть наследования, расширяющая возможности ООП. Теперь, чтобы разобраться с полиморфизмом, разберемся с наследованием.
Если один класс расширяет другой - он наследует все его доступные члены (методы/ПЭ). При создании объектов дочерних типов, вы как бы создаете еще и родительские объекты внутри дочернего. Можете представлять это как оболочки : создаем объект типа C, в нем создана оболочка (объект) типа B, в оболочке B создана оболочка A (дополнительно: каждый класс - наследник класса Object, поэтому во главе любой иерархии - класс Object). Если вы расширяете какой-либо класс, вы можете переопределить его методы, если нужно, конечно. Это работает так:
Полиморфные аргументы принимают все дочерние типы. Это вы усвоили. Но по вашему коду понятно, что вы не усвоили типизацию в Java. Давайте я объясню, что не так в вашем понимании. Вы думаете, что создавая ссылку типа A (подразумевая полиморфное обобщение), и присваивая ей созданный объект дочернего типа C, вы сможете вызвать методы, которые описаны в классе C, но нет. Объявляя ссылку родительского типа - вы ограничиваете себя в списке возможных методов. Компилятор проверяет - какие методы есть в классе, типом которого является ссылка, а не объект. В классе A метод m1, принимая полиморфный аргумент, выводит в консоль "А", поэтому, создавая ссылку типа A, присваивая ей объект типа C, компилятор посмотрит в класс А - там есть метод m1, и он выполнит именно этот метод. Java всегда выбирает правильную версию! Теперь покажу магию. Ваш код:
Второй пункт упустил. Но вы и сами разобрались.
Добавлено через 17 минут P.S. Такой вопрос - неужто в России так плохо с образованием, что профессора не могут объяснить учащимся о базовых вещах в ООП ?
0
|
|||||||||||||||||||||
|
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70
|
||||||
| 14.04.2014, 16:26 | ||||||
|
Если вы расширяете какой-либо класс, вы можете переопределить его методы, если нужно, конечно. Это работает так:
Код Java(TM) 2 Platform Standard Edition 5.0
А где тут переопределение?
1
|
||||||
| 14.04.2014, 16:37 | |
|
А мне вообще не нравятся такие примеры
![]() Сложно что-ли нормальные имена классам дать и объяснять по-человечески? От всех этих A B C m1 foo bar и прочей, ничего не значащей, ерунды только кавардак в голове. Назовите классы по-нормальному и сразу станет нагляднее и понятнее. Образование - дело важное и тут лучше день потерять, а потом за пять минут долететь )) Потому непонятно такое наплевательское отношение к названиям переменных в процессе обучения. Добавлено через 8 минут Да и вообще. Так ведь никто код не пишет. Зачем учить людей писать такую бессмысленную чушь? А потом удивляемся, что не понимаем даже того, что сами писали месяц назад
1
|
|
| 14.04.2014, 16:47 | |||||||
Главное правило образования - от малого к великому. Причем образование должно строиться на минимуме "готовых" знаний. Я считаю, студенты должны сами черпать информацию, благо в нашем веке источников более, чем достаточно и доступ к ним есть у всех. А названия методов - кому как удобно.
0
|
|||||||
| 14.04.2014, 16:47 | ||||||
|
Давайте для примера переведём это на нормальный язык?
теперь виден весь идиотизм этого примера?
0
|
||||||
| 14.04.2014, 16:50 | ||
Названия-то красивые, но главное понимать как это работает.
0
|
||
| 14.04.2014, 17:04 | |
|
Просто хотел сказать, что иногда проще сразу научить человека делать правильно, чем подставлять ему грабли вроде таких примеров и потом давать оплеухи за то, что он запутался в умело расставленных сетях. Проблема данного примера не в сложности, а в намерении запутать ученика. Не вижу в этом примере желания объяснить так, чтоб дошло. Короче некрасиво.
Добавлено через 2 минуты да какраз таки это ненужные переменные. они не используются! это важнее чем потенциальная перегрузка. Я об этом и говорю. Нормальные надо примеры делать, а не оторванные от реальности. ИМХО
1
|
|
| 14.04.2014, 17:07 | ||
|
Это уже вопрос об амбициях ученика. Меня никто не учил программированию. Я сам обложился книгами, статьями, туториалами и учусь, потому что это мне интересно. А если человеку дают знания, а он их не воспринимает - это говорит или о том, что ему плохо их преподносят, тогда единственный путь - самому изучить, или учащийся сам не хочет, подчеркну именно этот глагол, эти знания приобрести, тогда... думайте сами.
Добавлено через 2 минуты
0
|
||
| 14.04.2014, 17:37 | |
|
Мне кажется в любом обучении главное - цель. И очень важно, что бы обучение было интересным. Цель ученика это одно. А вот цель учителя - наверное в том, что бы объяснить человеку даже если он затупил, вывести его из тупняка и все равно объяснить.
Добавлено через 3 минуты Да ещё. иногда можно посмотреть на проблему под разными углами. Можно переименовать переменные. Убрать неиспользуемые переменные. Вот если бы их нельзя было убрать, согласитесь, уже по другому смотрелось бы? Тогда надо было бы задуматься почему нельзя убрать. А полиморфизм это инструмент а не сама цель. Добавлено через 3 минуты Крестовой отвёрткой закручиваются шурупы с крестовой хреновиной на них там сверху. Но чтобы научиться их закручивать, надо брать и крутить, а не рассуждать о том, куда можно засунуть крестовую отвёртку. Добавлено через 12 минут Хорошо ладно ![]() В данном примере все равно вызывается метод того класса, который был создан. Разве имеет смысл тип параметра? Добавлено через 5 минут Надеюсь теперь понятно почему эти переменные ненужны и сути они не меняют? Ну согласитесь, эти переменные созданы просто чтобы запутать.
0
|
|
|
5 / 5 / 2
Регистрация: 12.11.2011
Сообщений: 70
|
|
| 14.04.2014, 17:45 | |
|
Термин переопределение метода означает замещение версии метода, объявленной в базовом классе, новой, с точно такой же сигнатурой. Здесь нет переопределения.
void m1(B b) и void m1(A a) разная сигнатура. Перегрузка будет в том случае если эти два метода будут в одном классе, потому что у них разная сигнатура.
1
|
|
| 14.04.2014, 17:50 | |
|
Короче. Если мы будем вызывать функции разных классов с одним и тем же названием - вот это будет полиморфизм. А вызывать одну и ту же функцию одного и того же класса с разными параметрами и надеяться, что она как-то превратится в функцию другого класса из-за параметров это не полиморфизм, а идиотизм.
0
|
|
| 14.04.2014, 18:11 | ||||||||||||||
![]() В любом случае, то, что я расписал в посте на 1 странице - работает в целом для ООП. Главное запомнить, что если вы используете ссылку родительского типа и присваиваете ей объект дочернего типа, вы будете ограничены доступными членами только родительского класса (ну и его родителей, если это имеет место быть). ![]() Добавлено через 10 минут
Еще раз повторюсь. Полиморфизм - однообразная (единообразная) обработка разнотипных данных. Проявляется в полиморфных типах возвращаемого значения, а также в полиморфных аргументах. Теперь приведу пример полиморфизма:
0
|
||||||||||||||
| 14.04.2014, 18:19 | ||
|
Омг )) Можно назоздавать хоть стопитсот классов с разными или одинаковыми сигнатурами методов. Вызываем мы метод, принадлежащий экземпляру того класса, чей метод мы вызываем. Ну где тут полиморфизм? Или это какой то межклассовый полиморфизм? Не жирно будет чтоб ещё компилятор использовал какой-то левый код? ха ха ну зачем тогда вообще программировать? Что-то написал и компилятор сам порыскает по библиотекам и чёнить исполнит )) а мы посмеёмся )
Добавлено через 6 минут
0
|
||
| 14.04.2014, 18:23 | ||||||||
|
Полагаю, агрессия на мое замечание? Давайте вам объясню, и даже покажу, где тут полиморфизм.
Классы Dog и Lion - дочерние для Animal => они могут быть переданы в аргумент метода getName(). В классе Test с главным методом я показал, как это работает. Вот вам полиморфизм. Добавлено через 1 минуту
1
|
||||||||
| 14.04.2014, 18:35 | |
|
И вовсе я не накидывался. Извините у меня в голове наверное бардак. Если я вижу вызов функции конкретного класса то предполагаю, что будет вызвана именно функция того класса, чей метод я использую, а не какая-то функция дочернего или родительского класса. Да, сначала надо привести аргументы к типу вызываемой функции. Но лучше пусть мне компилятор напишет, что я неправильно вызываю, чем он исполнит что-то из вообще другого кода.
Добавлено через 5 минут Извините если нагрубил. Может просто С++ не так преподносит полиморфизм и в Java есть вещи, которых я пока не понимаю. Но вроде всё то же самое и приоритет вызовов такой же.
0
|
|
| 14.04.2014, 18:37 | |
|
У каждого свой индивидуальный стиль программирования. Программирование является утилитой для реализации моих идей. И, в первую очередь, я абстрактно размышляю - как это должно работать в теории, а потом на практике. Если вам угодно напрямую контактировать с компилятором - дело ваше. В любом случае, лучше модераторам тему почистить, а то мы своими беседами могли увести новичков в ненужную область понимания.
0
|
|
| 14.04.2014, 18:44 | ||
|
Да ещё. Спасибо вам за пример с животными. Лучше такие примеры, чем всякие непонятные A B C классы. Надеюсь вы поделитесь опытом с новичками, без всяких заумных извращений типа первого примера в этом топике
![]() На мой взгляд это пример того как не надо преподавать информацию. И собственно только это я и хотел сказать изначально. Добавлено через 3 минуты
0
|
||
| 14.04.2014, 18:48 | ||
|
Сложно не согласиться. Обычно программисты, которые хорошо понимают материал, показывают на пальцах вроде этих же A B C классов, зачем оригинальные названия, мы же программисты. xD
Хотя программирование - самая большая область из всех существующих. Это все, что может представить и далее смоделировать человек. Сознание не ограничено, так же как и наши возможности. Главное это понять. ![]() Добавлено через 2 минуты Все мы любим с компилятором общаться, когда дело доходит до высокоуровневых проектов и сжатых сроков. И вам спасибо за диалог, обычно местные попросят решения - поставят плюс и на этом все общение кончается...
0
|
||
| 14.04.2014, 18:48 | |
|
Помогаю со студенческими работами здесь
20
Exception in thread "main" java.lang.IllegalArgumentException: illegal component position at java.desktop/java.awt.Cont Полиморфизм
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|