Java для начинающих. Урок 32: Восходящее и нисходящее преобразование.

  Рет қаралды 83,669

alishev

alishev

7 жыл бұрын

МОЙ НОВЫЙ КУРС: • Мой курс "Продвинутая ...
ПРАКТИКА НА JAVA: java-marathon.tilda.ws
Upcasting и Downcasting.
Реклама и сотрудничество: alishev.neil@gmail.com

Пікірлер: 82
@alishevN
@alishevN 6 жыл бұрын
Регистрируйтесь на курс "Продвинутая Java": kzbin.info/www/bejne/qIPIYqmKZbh3epo Практикуйтесь в написании Java кода: java-marathon.tilda.ws
@user-bw7ov8ip5w
@user-bw7ov8ip5w 5 жыл бұрын
Здравствуйте, Наиль! У меня вопрос. Чем отличаться это? Animal animal = new Dog(); от этого? Animal animal = new Animal();
@korumstar9989
@korumstar9989 5 жыл бұрын
@@user-bw7ov8ip5w там пониже ответ есть.
@user-rk1ll9yy3n
@user-rk1ll9yy3n 4 жыл бұрын
Любая собака - животное, но не каждое животное - собака! ))
@YokoYokoOneTwo
@YokoYokoOneTwo 3 жыл бұрын
Queen Elizabeth quote: all poopoo times are peepee times but not all peepee times are poopoo times
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Сегодня в завтрашний день, не все могут смотреть. Вернее смотреть могут не только лишь все, не каждый может это делать. Если честно урок не до конца понял ((( Dog dog = new Dog(); Animal animal = dog; Eсли переменную animal мы теперь ссылаем на объект Dog, почему мы у animal не можем вызвать метод animal.bark? Она ведь хранит объект класса Dog, а он в свою очередь хранит этот метод. Это потому что Animal не наследуется от Dog?
@MsAsscreed
@MsAsscreed Жыл бұрын
Обьясните пожалуйста, правильно ли я понял: Animal animal = new Dog(); - восходящее преобразование. Переменная класса Animal ссылается на обьект классса Dog. А значит, собака подымается вверх по иерархии наследования и рассматривается как животное. Такая собака может есть, но не может гавкать. Dog dog = (Dog) animal; - нисходящее преобразование. Теперь на обьект класса Dog ссылается переменная класса Dog. По сути мы просто !!вернули!! собаку. Она обратно спустилась по иерархии наследования, и теперь снова может не только есть, но и гавкать. Получается, можно поднять и опустить потомка, НО НЕЛЬЗЯ ОПУСТИТЬ ПРЕДКА ВНИЗ. Мы не можем сделать нисходящее преобразование с предком и рассматривать его как собаку. Мы не можем сделать так: Dog dog = (Dog)new Animal(); То есть самое главное это то, что нисходящее преобразование работает только с обьектами - потомками, которые перед этим УЖЕ БЫЛИ "ПОДНЯТЫ НАВЕРХ" к предку! По сути, с предком мы вообще не можем делать никаких преобразований. Как такового нисходящего преобразования не существует, это просто ВОЗВРАЩЕНИЕ обратно обьекта, кторый до этого был восходяще преобразован. Так ?
@tigrangegamian1509
@tigrangegamian1509 4 жыл бұрын
По уроку понятно как делать преобразования , но для чего это надо , я так понимаю станет нескоро)
@qreol136
@qreol136 Жыл бұрын
Да, одна из самых больших проблем, то, что ты не понимаешь, для чего ты это все учишь
@user-eq7xg8gx1g
@user-eq7xg8gx1g Жыл бұрын
@@qreol136 а что бы вы хотели делать в программировании.?
@qreol136
@qreol136 Жыл бұрын
@@user-eq7xg8gx1g я уже учу spring)
@lt.morgan4063
@lt.morgan4063 Жыл бұрын
@@qreol136 для этого советую параллельно учить Computer Science, сам после этого стал гораздо больше понимать
@astronaut1751
@astronaut1751 Жыл бұрын
@@lt.morgan4063 а как ты изучаешь компьютерные науки ? Посоветуй книги и методики
@user-up6my6ne1h
@user-up6my6ne1h Жыл бұрын
Разобрался! Наиль, спасибо за ответ на коммент ниже! Здесь вся история про создание объектов и про то, какие методы этим объектам будут доступны. Восходящее преобразование ничем не отличается от нисходящего, кроме явного указания провести преобразование, это одно и тоже действие: мы создаем объект класса, но делаем ему доступными только те методы, которые есть в классе-типе (самое левое слово, при создании объекта). Animal названиеОбъекта = new Dog(); объекту доступны методы класса Dog, но только те, которые существуют и в классе Animal. или Dog названиеОбъекта = new Animal(); объекту доступны методы класса Animal, но только те, которые существуют и в классе Dog. Проблема в том, что если у класса-наследника всегда есть все методы класса-родителя или свои такие же, то у класса-родителя может не быть вообще ни одного метода, какие есть в классе-наследнике, то есть новому объекту не достанется вообще ни одного метода.
@sokronendow
@sokronendow Жыл бұрын
Спасибо, чувак!
@sokronendow
@sokronendow Жыл бұрын
Не, нифига не так. При даункастинге объекту методы класса Animal не доступны..
@user-fk7jl4ht1c
@user-fk7jl4ht1c 5 жыл бұрын
Спасибо за отличные уроки
@volodia9509
@volodia9509 7 жыл бұрын
Спасибо за отличные уроки, лучшие по Java! Можешь пожалуйста рассказать о способах создания простейшего оконного приложения и exe файла?
@vakhanalijaz
@vakhanalijaz 6 жыл бұрын
Пожалуйста не останавливайтесь, публикуйте уроки. Вы очень хорошо объясняете.
@alishevN
@alishevN 6 жыл бұрын
Спасибо! Совсем скоро будет готов курс "Продвинутая Java". Более 30 уроков по продвинутым темам, следите за обновлениями на канале.
@vosou1503
@vosou1503 2 жыл бұрын
Поздравляю с 100к
@nailovie4235
@nailovie4235 7 жыл бұрын
Спасибо)Все понятно)вы молодец)
@ivvalk
@ivvalk 6 жыл бұрын
спасибо за отличный контент! из замечаний - было бы удобней смотреть в другие файлы с помощью вертикального деления закладок. Что бы при переходе в другую закладку был виден другой код c которым работаешь :)
@yuriishevchenko2594
@yuriishevchenko2594 6 жыл бұрын
наверное нужно было бы рассказать про проверку instanceof при нисходящем преобразовании
@Andrzej3935
@Andrzej3935 2 жыл бұрын
Лучший преподаватель.
@MK-we4dl
@MK-we4dl 4 жыл бұрын
Не знаю как это может пригодиться, только запутывает в коде.
@Nokitana
@Nokitana 4 жыл бұрын
Здравствуйте)) Подскажите, пожалуйста, как в intellij idea включить поле c отображением методов текущего класса? У Вас в данном видео
@einoharanen6828
@einoharanen6828 5 жыл бұрын
Объясняешь чётко, но, для точного понимая сразу не вдуплить =)
@skotch_izolentovich
@skotch_izolentovich 6 жыл бұрын
Ты не рассказал про оператор instanceof, который может обезопасить downcasting. А так всё круто! Спасибо!
@C2H5OHH
@C2H5OHH 2 жыл бұрын
Спасибо!
@nikitaseliverstov6631
@nikitaseliverstov6631 7 жыл бұрын
Привет. Когда будут разбираться абстрактные классы ? Ты очень здорово объясняешь, удачи тебе)
@alishevN
@alishevN 7 жыл бұрын
объясню в ближайшее время.
@user-vy8wl3we4v
@user-vy8wl3we4v 7 жыл бұрын
В общем кратко и доходчиво. Но вопросы всё равно остались :( При восходящем преобразовании, я так понял, просто происходит отсекание методов класса-наследника (кроме переопределённых родительских). При нисходящем же методы класса-наследника всё-равно не приобретаются, а методы родительского класса просто переопределяются ...так какая-ж тогда между ними разница? %) Извиняюсь за смуту внесённую, но хотел бы ясно в голову вложить эти понятия....
@alishevN
@alishevN 7 жыл бұрын
Да, при восходящем преобразовании "отсекаются" метода класса - наследника, остаются только метода того класса, к которому совершается восходящее преобразование. При нисходящем преобразовании методы класса-наследника как раз таки приобретаются. Пример: Animal a = new Dog(); Dog d = (Dog) a; // Совершили нисходящее преобразование. Получили методы класса Dog.
@user-vy8wl3we4v
@user-vy8wl3we4v 7 жыл бұрын
По другому говоря мы просто расширяем интерфейс Animal до интерфейса Dog (если так можно выразится) ?
@alishevN
@alishevN 7 жыл бұрын
Да, именно.
@user-vy8wl3we4v
@user-vy8wl3we4v 7 жыл бұрын
Спасибо. Прорвало :) начинает доходить
@progtest109
@progtest109 Жыл бұрын
Вот я это учу пытаюсь понять но почему нельзя смоделировать ситуацию когда это реально нужно
@vadimkot2354
@vadimkot2354 Жыл бұрын
Интересно, в случае если происходит сначала Апкастинг, а потом Даункастинг, как узнать что объект после Даункаста имеет в себе метод дочернего объекта? Только после того как его попытались вызвать?
@dant5550
@dant5550 5 жыл бұрын
получается нечто обертки в обёртке. Если завернули child класс в родительский класс - то можем потом провернуть нисходящее преобразование, а если этого изначально не указали - то нельзя
@artembykov_yt
@artembykov_yt 7 жыл бұрын
Привет! Очень нравятся твои уроки, все понятно, подача отличная! Можешь подсказать, в каких случаях в реальной разработке используется восходящее и нисходящее преобразование? А то на абстрактных примерах не понятно( Спасибо!
@alishevN
@alishevN 7 жыл бұрын
В следующем уроке затрону эту тему.
@AK-it4nk
@AK-it4nk 7 жыл бұрын
Спасибо за урок! Было бы хорошо записать подробный урок про исключения, а то много не ясного.
@alishevN
@alishevN 7 жыл бұрын
Скоро будет.
@IT-SHNEEK
@IT-SHNEEK 5 ай бұрын
я одного понять не могу, какое практическое применение для этого
@t4jgat
@t4jgat Жыл бұрын
Как вывести иерархию классов сверху под вкладками?
@zabikhulloibragimov284
@zabikhulloibragimov284 4 жыл бұрын
Лучше не удалять ранее написанный код, а просто закомментировать. В дальнейшем он может с большой вероятностью послужить примером, так как новичкам сложно вспоминать что было стёрто, тем более вы сами говорите "... в предидущем примере мы писали..." Ролоики Агонь!)))
@PowerSharks
@PowerSharks 7 жыл бұрын
Единственное что непонятно - зачем это самое нисходящее преобразование нужно, если они небезопасно? В каких случаях его используют?
@olexiypysarenko8090
@olexiypysarenko8090 7 жыл бұрын
Перед тем как делать преобразование то можно сделать проверку if (animal instanceof Dog){ Dog dog = (Dog)animal;} instanceof проверяет будут ли методы класса Dog в переменной dog после преобразования.
@kandovvioletta6843
@kandovvioletta6843 Жыл бұрын
А если class Animal абстрактный. Он же не может иметь объекты. Тогда нисходящее преобразование не получится 🤔 надеюсь, я правильно понимаю.
@TierStar1994
@TierStar1994 3 жыл бұрын
Разве строки Animal animal = new Dog(); и Animal animal = dog; равнозначны? Dog dog = new Dog(); Animal animal = dog; // Разве это не значит, что мы ссылаем переменную animal на переменную dog, которая в свою очередь ссылается на объект класса Dog? В первом же случае мы создаём объект класса Dog и сразу же передаём его переменной animal. Не совсем понимаю данный момент, поэтому объясните, пожалуйста)
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Если ты System.out.println(dog); System.out.println(animal); то по хэш коду увидишь, что они оба ссылаются на объект Dog. То есть переменная animal в себе хранит объект класса Dog, но как это уложить в голове не понятно. Для чего это надо тоже не понятно пока. И еще если писать так: Dog dog = new Dog(); Animal animal = dog; тогда в переменную animal мы присваиваем переменную dog, которая в свою очередь хранит объект класса Dog.
@Roman-ey1bn
@Roman-ey1bn 4 жыл бұрын
То есть, что бы сделать безопасное нисходящее преобразование, нужно предварительно в родительский объект поместить дочерний,? Как в примере с собакой, когда собачий метод вызвать удалось?
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Получается так. То есть public class Animal extends Dog
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Мы можем рассматривать собаку как животное(для чего это надо для меня не понятно), потому что она наследуется от животного, а животное мы не можем рассматривать как собаку, потому что животное это родитель, оно не наследуется ни от кого.
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Мне не понятно следующее: Dog dog = new Dog(); Animal animal = dog; Eсли переменную animal мы теперь ссылаем на объект Dog, почему мы у animal не можем вызвать метод animal.bark? Она ведь хранит объект класса Dog, а он в свою очередь хранит этот метод. Это потому что Animal не наследуется от Dog?
@regrunk9414
@regrunk9414 6 ай бұрын
Халоу, нашёл ответ на вопрос?
@vladdrzd6484
@vladdrzd6484 6 жыл бұрын
Thank u for explaining
@Kitsikoo
@Kitsikoo 6 жыл бұрын
Всё равно трудно понять нахер это нужно?
@artdevh3735
@artdevh3735 3 жыл бұрын
Можно по простому понять когда тебе надо расширить или сузить функционал у объекта пользуйся этой темой!
@DolphinArtem
@DolphinArtem 2 жыл бұрын
Воообще )))
@Ronobiliv
@Ronobiliv 6 ай бұрын
Всем привет Спасибо за видео Короче, что я имперически вывел (сначала взрывает голову): Если мы собаку заворачиваем в животное (апкастинг), а затем то же животное заворачиваем в собаку (доункастинг), то вызывая методы второго преобразования, мы можем успешно их подтягивать (исключения не будет) ОДНАКО, если мы животное сразу заворачиваем в собаку и вызываем методы последнего, то получаем по хребту (исключение) я хз, видимо надо ни раз это прожевать, чтобы усвоить, особенно если в каком-нибудь проекте применять, но фича жесткая Если у вас есть логическое обоснование этому, буду рад прочесть ♥ Спасибо за внимание
@Ronobiliv
@Ronobiliv 6 ай бұрын
Смотри, тут не сложно в первом варианте, ты создал полноценную псину, от того и все вызывалось успешно во втором, ты создал животное и сказал, теперь ты - песя и пытаешься вызвать у него метод песика, что животное в общем смысле - не умеет все ок, ты молодец, хороший вопрос)
@user-ke6wc7tn1e
@user-ke6wc7tn1e 4 жыл бұрын
Все собаки животные, но не все животные собаки.Интересно, насколько полезны upcasting и downcasting в реальных проектах?
@user-px3cz2jm6k
@user-px3cz2jm6k 7 жыл бұрын
вы кто по проффессии? и кем работаете?
@pro_sto_misha1531
@pro_sto_misha1531 2 жыл бұрын
суть урока: не все животные - собаки, но все собаки - животные
@korumstar9989
@korumstar9989 5 жыл бұрын
Чуть голову не сломал с Dog dog = new Dog(); Animal animal = dog; но потом разобрался. Спасибо за работу!
@kladmonet9
@kladmonet9 3 жыл бұрын
Любое животное - человек, но не каждый человек - животное :). Некоторые человечки, к сожалению опускаются ниже... Благодарю за урок32 :)
@MrLight967
@MrLight967 3 жыл бұрын
каждый
@kladmonet9
@kladmonet9 3 жыл бұрын
@@MrLight967 нет
@MrLight967
@MrLight967 3 жыл бұрын
@@kladmonet9 вики открой и убедись что человек это животное из ряда приматов)
@kladmonet9
@kladmonet9 3 жыл бұрын
@@MrLight967 на сколько я помню, вики любой может корректировать:) Опять же ИМХО, человек существо пришедшее сюда из других планет и миров, принципиально отличающееся от животных. Но в первом своём комментарии я принял парадигму что все человеки - животные в идеале, но из-за алкоголя или других пороков не достойны называться даже животными:)
@MrLight967
@MrLight967 3 жыл бұрын
@@kladmonet9 биологически человек считается животным, в любом источнике посмотри, но вот почему людишки считают себя чем-то высшим я не понимаю
@vovaubin1606
@vovaubin1606 Жыл бұрын
Собачий метод))
@dijico2631
@dijico2631 3 жыл бұрын
собачий метод :D
@gemini341
@gemini341 10 ай бұрын
Еааажжж🎉е🎉аачо😢я все у🎉 аачо чувствую ч
@AdryanRMC
@AdryanRMC Жыл бұрын
а нах оно надо?
@user-qy7yv1ut4c
@user-qy7yv1ut4c 6 жыл бұрын
пример с int вообще неверный: если int базовый а long производный, то от лонга к инту мы не можем не явно преобразовать - а это получается восходящее и не нисходящее преобразования. этот пример вообще запутывает!!!
@user-qy7yv1ut4c
@user-qy7yv1ut4c 6 жыл бұрын
короче преобразование примитивов работает совершенно наоборот чем преобразование ссылочных у примитивов наоборот нисходящее явное)
@user-eq7xg8gx1g
@user-eq7xg8gx1g Жыл бұрын
Жонглирование методами и объектами, вся суть программирования на Java...
@palatense6584
@palatense6584 7 жыл бұрын
Спасибо!
Happy Birthday Mainframe: 60 years old and 60 years young!
1:00:49
Open Mainframe Project
Рет қаралды 56
Eccentric clown jack #short #angel #clown
00:33
Super Beauty team
Рет қаралды 22 МЛН
ПЕЙ МОЛОКО КАК ФОКУСНИК
00:37
Masomka
Рет қаралды 10 МЛН
Ну Лилит))) прода в онк: завидные котики
00:51
Раннее и Позднее Связывание
12:44
Volodya Mozhenkov
Рет қаралды 40 М.
Upcasting and Downcasting in Java - Full Tutorial
10:22
Coding with John
Рет қаралды 163 М.
Задача из Собеседования на 160,000 Евро в Год
13:27
Саша Лукин
Рет қаралды 1,1 МЛН
Изучение Java в одном видео уроке за час!
1:06:58
Гоша Дударь
Рет қаралды 1 МЛН
Дженерики в Java. Проще чем кажется.
21:36
Игорь Мешалкин
Рет қаралды 13 М.
Comparable и Comparator в Java
20:55
Тимофей Коваленко
Рет қаралды 10 М.
Eccentric clown jack #short #angel #clown
00:33
Super Beauty team
Рет қаралды 22 МЛН