почти никогда не пишу комментарии но брат преогромное спасибо тебе. очень четко понятно и эффективно для начинающих. спасибо тебе за то растраченное время который ты подарил яве и всем новичкам.
От видео к видео понимаю, что ещё не всё потеряно и смена сферы деятельности - реальность! Спасибо! Пока не могу отплатить большим чем коммент и лайк, поэтому вот!
Получается: 1) абстрактный класс = что-то базовое и большое, мы должны реализовать ВСЕ абстрактные методы, это удобно когда под этот класс попадают все или почти все сущности (например создаем машины, а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name и все машины имеют эти аттрибуты, т.е. реализовать все абстрактные методы ЕСТЬ смысл) 2) Интерфейсы = куски описания, которые не всегда пересекаются и их можно комбинировать, например нам нужно описать компьютер. Нет смысла все тулить в абстрактный класс, ведь компьютера бывают разные: ноутбук, домашний ПК, сервер, compute stick. И объекты будут иметь поля: внешний блок питания (большой ПК / сервер), Адаптер питания (ноутбук, маленький компьютер), монитор, встроенный дисплей (ноутбук), DVD-привод (у compute stick нет вообще такого) и т.д., то есть нет смысла все это пихать в абстрактный класс и потом при желании создать объект ноутбука переопределять ненужные методы типо внешнего дисплея, внешнего блока питания и большого корпуса, т.к. это ноутбук и там попросту этого нет. А вместо этого можно реализовать по отдельности интерфейсы ноутбук, домашний ПК, сервер, compute stick, которые уже будут иметь только НУЖНЫЕ методы. Я правильно рассуждаю?
Если я правильно понимаю, то интерфейс описывает то, что класс будет уметь делать =)) В вашей аналогии ноутбук, домашний ПК и т.д - это не интерфейсы, а сущности. Отсюда логичнее было бы сделать абстрактный класс Computer и от него создавать конкретные классы наследники Notebook, Compute Stick. Прошло 8 месяцев, но все же =)))
хочу уточнить и добавить: " а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name " - это поля, а не методы. Методы обозначают действие и описываются глаголами (run, go, eat, ride etc). Еще важная разница между абстрактными классами и интерфейсами: интерфейсы не могут иметь полей, а абстрактные классы могут, как и любые классы. Классы как абстрактные так и нет именуются существительным (wheels, maxSpeed, doors, color, name), а интерфейсы прилагетельными, которые указывают на умение или возможность действия(eatable, ableToGo, runable, shotable etc)...
@@nod745 А удобнее ли? На сколько я понял, интерфейс более гибкий и обширный. Какая необходимость была создавать абстрактные классы, если возможно их заменить интерфейсами?
@@vladimirplohotniuk5214 представь, что у тебя код игры и в нем есть 150-200 персонажей, каждому нужен набор данных, внешность, поведение, класс, раса и т. д., если ты каждому персонажа будешь иплементить по 20 интерфейсов, это не очень удобно
СПАСИБО ОГРОМНОЕ! Я ОЧЕНЬ ДОЛГО НЕ МОГ ПОНЯТЬ КАК ОТЛИЧАЮТСЯ Абстрактный класс и интерфейс! Здесь я понял всё и сразу! Спасибо большое! Очень часто ты объясняешь то, чего нет нигде, и без чего было-бы сложно обойтись! Очень тебе благодарен. Ещё раз огромное спасибо!
Спасибо за понятные и наглядные объяснения, почти всегда начинаю изучение темы с просмотра вашего видео. Возможно, иногда рассматриваются не все глубинные аспекты и тонкости, но после выработки полноценного понимая сути той или иной конструкции - можно спокойно это понимание расширять различными тонкостями и подробностями. Для выработки этого понимания, на мой взгляд, лучший канал и в принципе источник информации в русскоязычном сегменте 👍
За это и люблю программирование. Ролику 6 лет! А он до сих пор лучше всего, что я видел по этой теме до этого. Спасибо огромное. Вы делаете жизнь тысячи начинающих программистов проще.
Спасибо большое за урок. Решила освежить информацию в памяти. Только хочу обратить внимание, что в абстрактном классе в отличие от интерфейса можно задавать поля. Точнее в интерфейсе тоже можно, но они всегда будут public static final. В то время как в абстрактном классе можно задавать поля характеризующие схожие сущности
Объясняешь как БОГ!👍🏻 Все четко и понятно! а на платных курсах в злополучной «акадЭмии» ШАГ препод не мог объяснить толком зачем нужны абстрактные классы вообще и в чем их отличие от интерфейсов 😎зато постоянно ставил себя выше всех и высмеивал домашние задания… в общем небо и земля …
Урок хороший, но тут ничего не сказано про то, что абстрактные классы можно использовать для того что бы не реализовывать все методы интерфейса. Т.е. : public interface Test { public void first(); public void second(); } public abstract class TestAbstract implements Test { @Override public void first(){ System.out.println("Hello World"); } } далее наследуемся от абстрактного класса и пользуемся методом. В данном случае нам не пришлось реализовывать все методы интерфейса которые могут быть избыточными. Я думаю на это нужно обратить внимание.
@@Игорь-ж3ш если в интерфейсе прописать default поведение метода, то его не обязательно реализовывать ( java 8+) в в классе, который имплементирует этот интерфейс
@@GtoUfromR - Можно использовать reference variable типа abstract класса, чтобы ссылаться на объект дочернего класса, который не является abstract. - abstract класс не может быть final! - потому что это 2 противоположных понятия, final - не наследуется, а abstract класс для того и пишут чтобы он имел наследников! - У abstract классов есть конструктор. Даже независимо от того, что создать объект классу abstract невозможно! + если мы его создали, то его нужно будет перезаписать в дочернем классе с ключевым словом super(); иначе компилятор заблочит код. - Для методов не допустимо сочетание: final abstract, private abstract, static abstract. Private abstract - просто на просто не виден, а должен быть перезаписан. Static abstract - статические методы не могут быть перезаписаны, а абстрактные методы должны быть перезаписаны. Final abstract - также не сможем делать @Override метода. Потому что он final. Он в целом не может наследоваться! - Конкретный класс(типа обычный) может расширять(extends) абстрактный класс и на оборот. Также абстрактный класс может расширять абстрактный класс! ЭТО тоже РАЗРЕШЕНО! И также АБСТРАКТНОМУ КЛАССУ РАЗРЕШЕНО имплементировать ИНТЕРФЕЙС. - Абстрактные классы используются, когда есть отношение "is-a", то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом. - это про различия между классом и интерфейсом. - *Абстрактный класс наследуется (extends), а интерфейс - реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов - сколько угодно (Наследование - одно уровневое, Реализация - многоуровневая). Интерфейс может наследовать (extends) другой интерфейс/интерфейсы, но не КЛАССЫ, это запрещено компилятором - *Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть. private переменные не создашь в виде полей, потому что геттеры и сеттеры к ним не опишешь. P.S это материал из других курсов в которых эту тему расмусоливали 2 часа с примерами. Поэтому я согласен что здесь все по верхах, но для закрепления пройденного самое то!
Может ли, к примеру, класс Dog быть одновременно и extend Animal, и implements ableToMakeSound? Т.е. наследоваться и от класса Animal и реализовывать методы интерфейса одновременно?
Спасибо за видео! Скажите пожалуйста, в чем конкретно смысл создавать абстрактный метод, если при наследовании его приходится переопределять, т.е. по сути писать его заново с конкретными значениями. Это что-то вроде напоминалки, что такой метод должен обязательно быть реализован?
Привет! Вот на твоем примере уже к концу когда ты реализовал интерфейс Abletomakesound, и забрал у него метод makesound, тогда получается нам уже не нужен абстрактный класс Animal, ведь там тот же метод, или я неправильно думаю? И второй вопрос, можем ли мы в классе dog, сразу написать что мы и реализуем интерфейс и еще расширяем класс Animal, то есть dog extends Animal and implements AbletomakeSounds?
К примеру у нас есть абстрактный класc Animal, а так же классы Dog, Cat, Cow которые его наследуют. И вот нам потребовалось создать класс Human, например, который умеет спать (так же как и животные класса Animal). Наверно в этом случае и пригодиться интерфейс, правильно?)
Абстрактный класс - это обобщения сущности и действий, а интерфейс - это лишь подтверждения того, что те или иные действия (методы) будут в классе? Я верно понимаю?
Абстрактный класс: Класс персонажа, здоровье персонажа, броня, мана Интерфейс: его способности, пассивные умение Правильно понимаю? Поправьте если нет, желательно на похожем примере. Спасибо
Если говоришь про "идейную" разницу, то можно и так сказать. Или например: аб.класс "Эльф": здоровье, мана, броня интерфейс "Живой пресонаж": ударить, похилиться, бежать, спать. пусть будет для примера твоего класса: эльф-мечник(это условно твой конечный класс с которым работаешь. у него там имя и возраст параметры например, а так же какие нибудь характерные методы) . он наследуется от общего абстрактного класса расы Эльф (в данном случае абстрактный класс с здоровьем маной и броней для данной фракции). и соответственно твой эльф-мечник реализуем интерфейс "живой персонаж", где прописано что может (А вернее обязан уметь) делать твой эльф-мечник. если спросить: Зачем нужен абстрактный класс? Затем, что если ты условно захотел создать себе Эльфа-лучника, то он всё равно будет являться по своей расе Эльфом. И для него не придётся описывать эльфиские параметры. Достаточно чтобы и Эльф-мечник и Эльф-лучник наследовались от абстрактного класса "эльф". Ведь у каждого эльфа есть общие характеристики. если спросить: Зачем нужен интерфейс? Чтобы понимать что может делать любой персонаж в игре в принципе. Например, этот же интерфейс могут реализовывать и друге расы: Гномы, Люди, Орки и т.д.
Резюмируя:самое главное приемущество абстрактного класа это избавление от дублирования кода (общая логика в абстрактном классе) и а разная логика реализовуеться в каждом дочернем классе.
Я правильно понимаю что абстрактный класс создаётся только для того чтобы при наследовании от него, компилятор давал по шапке за то что ты забыл реализовать тот или иной метод?
Выскажу своё определение. Интерфейс СВЯЗЫВАЕТ две логические единицы программы. Абстрактный класс ДОПОЛНЯЕТ одну или несколько логических единиц своей логикой.
я так понял что от Абстрактных классов мы наследуем все что свойственно всем классам потомкам, а интерфейсы реализуем когда есть какие то отличительные свойства классов. т.е методы eat() и sleep() отнаследуем от класса, а fly(), sweam() от интерфеса. я правильно понял?
Коллеги, может поясните: зачем нужен абстрактный класс если все равно в каждом наследнике надо переписывать метод. Не проще в классе родителе написать все общие одинаковые методы из серии идти, назвать и т.д., а в классе наследнике просто написать такой метод который нужно?
Вы говорили о том что обьект абстрактного класса нельза создать, но у меня получилось создать обьект абстрактного класа, вот таким вот образом, может я что то не правильно понял, я новичок обьясните пожалуйста. Animal animal= new Animal() { @Override public void makeSound() { } };
Очень хорошие уроки, мне как начинающему очень понятно. Но есть такое дело...я понимаю в чём отличие класса от интерфейса, но если спросить вкратце, можно ответить так?: Интерфейс - контракт, абстрактный класс- контракт со своими условиями в виде собственных реализованных методов.
Нет,не верно.Если бы автор корректно описал пример с животными, то Вы бы всё правильно поняли,но похоже,что автор и сам не совсем разобрался,раз он так Вам отвечает. Абстрактный класс,как и любой другой класс является чертежом,он описывает свойства объекта.Если мы возьмем конкретно этот пример,то правильно было бы создать переменные name, age, sex,voice(имя,возраст,пол,звук) и создать в этом абстрактном классе абстрактные методы сеттеры и геттеры(позволяют установить или же вернуть эти значения) и те,которые мы потом закинули в интерфейс(makeVoice и eat).Теперь, если мы посмотрим,то все эти методы описывают вообще всех животных,которые только существуют. Переходим к интерфейсам,интерфейс(контракт) - это способность что-то делать.Для более ясного понимания создадим еще один класс Птеродактиль и два интерфейса,первый описывает умение(возможность) ходить по земле, а второй возможность летать.Теперь,все три класса Cat,Dog и Pterodactyl наследуются от Animals т.к. все три ЯВЛЯЮТСЯ животными(это, кстати проверочное слово при наследовании),а вот с интерефейсами дела обстоят по-другому кошка и собака могут ходить,но не могут летать,поэтому имплементируем только первый интерфейс,а вот птеродактиль может как ходить так и летать,поэтому тут имплементируем оба интерфейса. Мы знаем,что в джаве нет множественного наследования,как в С++,но зато мы можем имплементировать сколько угодно интерфейсов,что полностью это компенсирует(Как по мне это удобнее).И вот теперь если у нас появятся новые классы тигр,лев,рысь и воробушек,синичка,ласточка, то мы видим всю мощь полиморфизма в ООП и нам будет очень удобно описать все эти классы.
Получается: 1) абстрактный класс = что-то базовое и большое, мы должны реализовать ВСЕ абстрактные методы, это удобно когда под этот класс попадают все или почти все сущности (например создаем машины, а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name и все машины имеют эти аттрибуты, т.е. реализовать все абстрактные методы ЕСТЬ смысл) 2) Интерфейсы = куски описания, которые не всегда пересекаются и их можно комбинировать, например нам нужно описать компьютер. Нет смысла все тулить в абстрактный класс, ведь компьютера бывают разные: ноутбук, домашний ПК, сервер, compute stick. И объекты будут иметь поля: внешний блок питания (большой ПК / сервер), Адаптер питания (ноутбук, маленький компьютер), монитор, встроенный дисплей (ноутбук), DVD-привод (у compute stick нет вообще такого) и т.д., то есть нет смысла все это пихать в абстрактный класс и потом при желании создать объект ноутбука переопределять ненужные методы типо внешнего дисплея, внешнего блока питания и большого корпуса, т.к. это ноутбук и там попросту этого нет. А вместо этого можно реализовать по отдельности интерфейсы ноутбук, домашний ПК, сервер, compute stick, которые уже будут иметь только НУЖНЫЕ методы. Я правильно рассуждаю?
@@olehanfimov7438 package com.java.lessons.Interfeis; public class MAN { public static void main(String[] args) { Cat c= new Cat(); Dog1 d=new Dog1(); Pterodactil p=new Pterodactil(); c.setAge(5,"Kytti","Girl","MEEEOOOOWWWW"); d.setAge(10,"Fill","Boy","GAV GAV GAV"); p.setAge(100,"Grasy","Boy","KARRRR"); c.Names();c.Ages();c.Sexs();c.Sound();c.Go();c.Swim(); d.Names();d.Ages();d.Sexs();d.Sound();d.Go();d.Swim(); p.Names();p.Ages();p.Sexs();p.Sound();p.Fly();p.Go();p.Swim(); }}package com.java.lessons.Interfeis; Меня зовут Kytti Мне 5 лет я Girl Я MEEEOOOOWWWW Kytti walk Kytti swim Меня зовут Fill Мне 10 лет я Boy Я GAV GAV GAV Fil walk Fill Swim Меня зовут Grasy Мне 100 лет я Boy Я KARRRR Pterodactil is flying Pterodactil on the ground Pterodactil swim Process finished with exit code 0
так в интерфейсе можно же реализовать те методы, где они будут для всех. +имплиментить можно сколько хочешь, а экстендить только одного. Мне кажется абстрактные методы - устаревшее явление.
Нашел ответ на вопрос, так для чего оно надо если методы можно и так вызвать: Это нужно для гарантии того, что в наследуемых классах будет реализован метод с тем же названием и похожим функционалом. Например, у классов Треугольник и Круг должен быть реализован абстрактный метод get_area, который считает площадь. Иначе можно писать в одном классе area, в другом get_area, что вызывает путаницу и проблемы с поддержкой кода. Имхо, думаю это не вся суть:)
Блин все равно не понял. Интерфейс это контракт который обязывает реализовать имплементириующие классы все методы которые находятся в интерфейсе. А асбтрактный класс че то не втюрился... Больше похоже на "Вы не понимаете, это другое")))
Каковы различия между абстрактным классом и интерфейсом в Java? *Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть. private переменные не создашь в виде полей, потому что геттеры и сеттеры к ним не опишешь. *Абстрактный класс наследуется (extends), а интерфейс - реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов - сколько угодно (Наследование - одно уровневое, Реализация - многоуровневая). Интерфейс может наследовать (extends) другой интерфейс/интерфейсы, но не КЛАССЫ, это запрещено компилятором! *Абстрактные классы используются, когда есть отношение "is-a", то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом.
Каждый второй пишет, что ему все понято, верю ))). Автору поклон за труд, но по ощущениям тема не раскрыта, примеры слабоваты. Это первый урок, который я пропускаю.
Возникло несколько вопросов: Может ли абстрактный класс реализовывать интерфейс? Может ли класс потомок реализовывать отличный от родительского класса интерфейс или только те что прописаны у предка? Может ли класс одновременно extends и implements?
Вообще ниче не понятно, пересмотрел раз 10, исходя из урока только 1 вывод- интерфейсы и абстрактные классы это тож самое, просто если тебе надо чтобы были реализованы все методы- выбирай интерфейс, если тебе надо чтобы было реализовано много методов , но не все, можешь использовать абстрактные класс
материал прям ерунда и про интерффейсы прям тупые реализациии, сам не понимаеш и других не путай. Поищите еще что в инете, про интерфейс,не забивайте голову... не слушайте про контракт, он в ушах плеш проел . , но так тяжело слушать этот "а ля бритиш акцент", на хрена он нужен? этот "аабшштээракт", если другие слова тупа рубиш по русскому акценту class-класс , animals -анималс. или этот ." interface" -интерфейс... ,а почему не "Энтэрфайсзе"... - или не "Иинтэ файcе" как есть правильно ))) икстати и у них abstract - и произносится "абстракт".
Регистрируйтесь на курс "Продвинутая Java": th-cam.com/video/rRe1vT0SDD8/w-d-xo.html
Практикуйтесь в написании Java кода: java-marathon.tilda.ws
почти никогда не пишу комментарии но брат преогромное спасибо тебе. очень четко понятно и эффективно для начинающих. спасибо тебе за то растраченное время который ты подарил яве и всем новичкам.
Никогда не устану говорить вам спасибо, за такие простые и лаконичные объяснения казалось бы не самых простых идей!
От видео к видео понимаю, что ещё не всё потеряно и смена сферы деятельности - реальность! Спасибо! Пока не могу отплатить большим чем коммент и лайк, поэтому вот!
В колокол позвони :)
Интересно , спустя год узнать чем ты сейчас занимаешься? получил ли ты свою первую работы в сфере айти? Если да то поздравляю
@@feliksbekeshov7668 а ты кемто стал за год?(просто интересно, сейчас 2 месяц учусь)
@@hdhsjsjwksjsjska привет, да уже работаю разработчиком
@@feliksbekeshov7668 красава
Получается:
1) абстрактный класс = что-то базовое и большое, мы должны реализовать ВСЕ абстрактные методы, это удобно когда под этот класс попадают все или почти все сущности (например создаем машины, а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name и все машины имеют эти аттрибуты, т.е. реализовать все абстрактные методы ЕСТЬ смысл)
2) Интерфейсы = куски описания, которые не всегда пересекаются и их можно комбинировать, например нам нужно описать компьютер. Нет смысла все тулить в абстрактный класс, ведь компьютера бывают разные: ноутбук, домашний ПК, сервер, compute stick. И объекты будут иметь поля: внешний блок питания (большой ПК / сервер), Адаптер питания (ноутбук, маленький компьютер), монитор, встроенный дисплей (ноутбук), DVD-привод (у compute stick нет вообще такого) и т.д., то есть нет смысла все это пихать в абстрактный класс и потом при желании создать объект ноутбука переопределять ненужные методы типо внешнего дисплея, внешнего блока питания и большого корпуса, т.к. это ноутбук и там попросту этого нет. А вместо этого можно реализовать по отдельности интерфейсы ноутбук, домашний ПК, сервер, compute stick, которые уже будут иметь только НУЖНЫЕ методы.
Я правильно рассуждаю?
Все правильно! Хорошие аналогии.
Если я правильно понимаю, то интерфейс описывает то, что класс будет уметь делать =)) В вашей аналогии ноутбук, домашний ПК и т.д - это не интерфейсы, а сущности.
Отсюда логичнее было бы сделать абстрактный класс Computer и от него создавать конкретные классы наследники Notebook, Compute Stick.
Прошло 8 месяцев, но все же =)))
хочу уточнить и добавить: " а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name " - это поля, а не методы. Методы обозначают действие и описываются глаголами (run, go, eat, ride etc). Еще важная разница между абстрактными классами и интерфейсами: интерфейсы не могут иметь полей, а абстрактные классы могут, как и любые классы. Классы как абстрактные так и нет именуются существительным (wheels, maxSpeed, doors, color, name), а интерфейсы прилагетельными, которые указывают на умение или возможность действия(eatable, ableToGo, runable, shotable etc)...
@@nod745 А удобнее ли? На сколько я понял, интерфейс более гибкий и обширный. Какая необходимость была создавать абстрактные классы, если возможно их заменить интерфейсами?
@@vladimirplohotniuk5214 представь, что у тебя код игры и в нем есть 150-200 персонажей, каждому нужен набор данных, внешность, поведение, класс, раса и т. д., если ты каждому персонажа будешь иплементить по 20 интерфейсов, это не очень удобно
Долго не понимала тему абстрактные классы, а после просмотра видео сразу стало все на свои места. Спасибо!
СПАСИБО ОГРОМНОЕ! Я ОЧЕНЬ ДОЛГО НЕ МОГ ПОНЯТЬ КАК ОТЛИЧАЮТСЯ Абстрактный класс и интерфейс! Здесь я понял всё и сразу! Спасибо большое! Очень часто ты объясняешь то, чего нет нигде, и без чего было-бы сложно обойтись! Очень тебе благодарен. Ещё раз огромное спасибо!
Спасибо за понятные и наглядные объяснения, почти всегда начинаю изучение темы с просмотра вашего видео. Возможно, иногда рассматриваются не все глубинные аспекты и тонкости, но после выработки полноценного понимая сути той или иной конструкции - можно спокойно это понимание расширять различными тонкостями и подробностями. Для выработки этого понимания, на мой взгляд, лучший канал и в принципе источник информации в русскоязычном сегменте 👍
За это и люблю программирование. Ролику 6 лет! А он до сих пор лучше всего, что я видел по этой теме до этого. Спасибо огромное.
Вы делаете жизнь тысячи начинающих программистов проще.
Однозначно лайк. Ты просто мега-доступно объясняешь. Огромное спасибо) Протолкнул меня на множество просветлений в джаве))
Я с таким наслаждением и без особых усилий еще никогда не приобретал новые знания, все благодаря грамотной подаче материала👍
Редко когда пишу комментарии, но твои видео просто супер, помогают в обучении. Спасибо огромное
Спасибо большое за урок. Решила освежить информацию в памяти. Только хочу обратить внимание, что в абстрактном классе в отличие от интерфейса можно задавать поля. Точнее в интерфейсе тоже можно, но они всегда будут public static final. В то время как в абстрактном классе можно задавать поля характеризующие схожие сущности
Автор, огромное спасибо вам! Все очень понятно объясняете. Очень ждем нового приближающегося курса:3
Всё по полочкам! Благодарю за инфу. Даже решил кое-что законспектирвоать!
автор просто настоящее золото разжевал то что я месяц не мог понять
Как все таки доходчиво ты объясняешь!!! Спасибо!!!
Прекрасно поясняете! Спасибо Вам!
Объясняешь как БОГ!👍🏻 Все четко и понятно! а на платных курсах в злополучной «акадЭмии» ШАГ препод не мог объяснить толком зачем нужны абстрактные классы вообще и в чем их отличие от интерфейсов 😎зато постоянно ставил себя выше всех и высмеивал домашние задания… в общем небо и земля …
Спасибо большое, прекрасные уроки!
Урок хороший, но тут ничего не сказано про то, что абстрактные классы можно использовать для того что бы не реализовывать все методы интерфейса. Т.е. :
public interface Test {
public void first();
public void second();
}
public abstract class TestAbstract implements Test {
@Override
public void first(){
System.out.println("Hello World");
}
}
далее наследуемся от абстрактного класса и пользуемся методом. В данном случае нам не пришлось реализовывать все методы интерфейса которые могут быть избыточными. Я думаю на это нужно обратить внимание.
верно, чувак просто не докачал тему, методы все равно все надо реализовать!
Если далее наследоваться от абстрактного класса, то все равно нужно будет реализовать методы интерфейса
@@Игорь-ж3ш если в интерфейсе прописать default поведение метода, то его не обязательно реализовывать ( java 8+) в в классе, который имплементирует этот интерфейс
@@maxkatrenko8865 ну говорят то про другую особенность
Спасибо за работу.
Доступно, но поверхностно. Это маме посмотреть чем сын весь день занят))
@@GtoUfromR
- Можно использовать reference variable типа abstract класса, чтобы ссылаться на объект дочернего класса, который не является abstract.
- abstract класс не может быть final! - потому что это 2 противоположных понятия, final - не наследуется, а abstract класс для того и пишут чтобы он имел наследников!
- У abstract классов есть конструктор. Даже независимо от того, что создать объект классу abstract невозможно! + если мы его создали, то его нужно будет перезаписать в дочернем классе с ключевым словом super(); иначе компилятор заблочит код.
- Для методов не допустимо сочетание: final abstract, private abstract, static abstract. Private abstract - просто на просто не виден, а должен быть перезаписан. Static abstract - статические методы не могут быть перезаписаны, а абстрактные методы должны быть перезаписаны. Final abstract - также не сможем делать @Override метода. Потому что он final. Он в целом не может наследоваться!
- Конкретный класс(типа обычный) может расширять(extends) абстрактный класс и на оборот. Также абстрактный класс может расширять абстрактный класс! ЭТО тоже РАЗРЕШЕНО! И также АБСТРАКТНОМУ КЛАССУ РАЗРЕШЕНО имплементировать ИНТЕРФЕЙС.
- Абстрактные классы используются, когда есть отношение "is-a", то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом. - это про различия между классом и интерфейсом.
- *Абстрактный класс наследуется (extends), а интерфейс - реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов - сколько угодно (Наследование - одно уровневое, Реализация - многоуровневая). Интерфейс может наследовать (extends) другой интерфейс/интерфейсы, но не КЛАССЫ, это запрещено компилятором
- *Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть. private переменные не создашь в виде полей, потому что геттеры и сеттеры к ним не опишешь.
P.S это материал из других курсов в которых эту тему расмусоливали 2 часа с примерами. Поэтому я согласен что здесь все по верхах, но для закрепления пройденного самое то!
Ну просто всё разжевал досконально. Спасибо!!!
Отличный канал! Всё понятно. Спасибо.
Пожалуйста :)
Спасибо!
Юзаю информацию для подготовки к экзамену по программированию в Германии :)
0:00 Классы
6:23 Интерфейсы
Может ли, к примеру, класс Dog быть одновременно и extend Animal, и implements ableToMakeSound? Т.е. наследоваться и от класса Animal и реализовывать методы интерфейса одновременно?
да, может.
Как говорил великий программист(бомж Валера): "Лучше один раз попробовать, чем десять раз услышать".
@@alishevN а как это оформить? я так понял,что либо наследуемся либо имплементим? а как совместить?
@@vadpivot public class Cat extends Animal implements MakeSound
вот так сработало.
Хороший выпуск🔥
Большое спасибо! Все по полочкам.
Спасибо большое за ваш труд!
Классно объяснил, спасибо большое тебе.
Спасибо огромное!
Спасибо за видео!
Скажите пожалуйста, в чем конкретно смысл создавать абстрактный метод, если при наследовании его приходится переопределять, т.е. по сути писать его заново с конкретными значениями. Это что-то вроде напоминалки, что такой метод должен обязательно быть реализован?
Создавая абстрактный метод мы налагаем обязательство на его реализацию всем тем, кто наследуется от нашего абстрактного класса.
Спасибо большое. Понятно всё объяснил
Хорош. Аплодирую стоя!
Блин, это круто и гениально.
Привет! Вот на твоем примере уже к концу когда ты реализовал интерфейс Abletomakesound, и забрал у него метод makesound, тогда получается нам уже не нужен абстрактный класс Animal, ведь там тот же метод, или я неправильно думаю? И второй вопрос, можем ли мы в классе dog, сразу написать что мы и реализуем интерфейс и еще расширяем класс Animal, то есть dog extends Animal and implements AbletomakeSounds?
Спасибо за урок)
Пожалуйста!
К примеру у нас есть абстрактный класc Animal, а так же классы Dog, Cat, Cow которые его наследуют. И вот нам потребовалось создать класс Human, например, который умеет спать (так же как и животные класса Animal). Наверно в этом случае и пригодиться интерфейс, правильно?)
Спасибо за видео. Странно, что просмотров и комментариев совсем не много
Спасибо за труд, видосик зашел. Еще бы запомнить (КАК?)
Абстрактный класс - это обобщения сущности и действий, а интерфейс - это лишь подтверждения того, что те или иные действия (методы) будут в классе? Я верно понимаю?
Не могу вызвать метод makeSound из класса Dog из-за ошибки Non-static method 'makeSound()' cannot be referenced from a static context.
public static makeSound(){}
и посмотри видос про статик, на этом же канале
Если я ставлю static, то у меня начинаются проблемы с классом Animal
@@PianoElipse а ты через объект вызываешь метод ?
Спасибо большое
Абстрактный класс: Класс персонажа, здоровье персонажа, броня, мана
Интерфейс: его способности, пассивные умение
Правильно понимаю? Поправьте если нет, желательно на похожем примере. Спасибо
Если говоришь про "идейную" разницу, то можно и так сказать. Или например:
аб.класс "Эльф": здоровье, мана, броня
интерфейс "Живой пресонаж": ударить, похилиться, бежать, спать.
пусть будет для примера твоего класса: эльф-мечник(это условно твой конечный класс с которым работаешь. у него там имя и возраст параметры например, а так же какие нибудь характерные методы) . он наследуется от общего абстрактного класса расы Эльф (в данном случае абстрактный класс с здоровьем маной и броней для данной фракции). и соответственно твой эльф-мечник реализуем интерфейс "живой персонаж", где прописано что может (А вернее обязан уметь) делать твой эльф-мечник.
если спросить: Зачем нужен абстрактный класс? Затем, что если ты условно захотел создать себе Эльфа-лучника, то он всё равно будет являться по своей расе Эльфом. И для него не придётся описывать эльфиские параметры. Достаточно чтобы и Эльф-мечник и Эльф-лучник наследовались от абстрактного класса "эльф". Ведь у каждого эльфа есть общие характеристики.
если спросить: Зачем нужен интерфейс? Чтобы понимать что может делать любой персонаж в игре в принципе. Например, этот же интерфейс могут реализовывать и друге расы: Гномы, Люди, Орки и т.д.
@@anruslanov огромное человеческое спасибо)
Супер понятно!
Резюмируя:самое главное приемущество абстрактного класа это избавление от дублирования кода (общая логика в абстрактном классе) и а разная логика реализовуеться в каждом дочернем классе.
наоборот,реализуешь в наследнике и реализация разная,только вызов одинаков...вот он не упомянул как наследовать и имплементить одновременно
@@vadpivot програмирование это весело все понимают одинаково но обьясняют по разному :) на интервью тоже самое
@@caffeinejavacode1475 о пардон похоже я не тому ответил,рука дернулась...
а почему метод eat не относледовался?
Добрый день, а поля абстрактного класса мы обязаны переопределить в наследующем классе? Есть разница с полями обычного класса?
Мое почтение!
Здорово!
Я правильно понимаю что абстрактный класс создаётся только для того чтобы при наследовании от него, компилятор давал по шапке за то что ты забыл реализовать тот или иной метод?
Я вот тоже понять не могу. Как-будто бы интерфейсы тоже для этого предназначены
Выскажу своё определение.
Интерфейс СВЯЗЫВАЕТ две логические единицы программы.
Абстрактный класс ДОПОЛНЯЕТ одну или несколько логических единиц своей логикой.
я так понял что от Абстрактных классов мы наследуем все что свойственно всем классам потомкам, а интерфейсы реализуем когда есть какие то отличительные свойства классов. т.е методы eat() и sleep() отнаследуем от класса, а fly(), sweam() от интерфеса. я правильно понял?
Подскажите, могут ли быть абстрактные методы у обычного, не абстрактного класса?
Нет
получается в интерфейсе мы не можем объявлять переменные ?
нет, но можно константы static final
Спасибо)
Получается, абстрактные классы - это те же интерфейсы, но с частичной реализацией и без возможности множественного наследования.
Да.
В интерфейсах же есть реализация по-умолчанию. Получается, абстрактный класс отличается только невозможностью множественного наследования?
Коллеги, может поясните: зачем нужен абстрактный класс если все равно в каждом наследнике надо переписывать метод. Не проще в классе родителе написать все общие одинаковые методы из серии идти, назвать и т.д., а в классе наследнике просто написать такой метод который нужно?
Спасибо!
Вы говорили о том что обьект абстрактного класса нельза создать, но у меня получилось создать обьект абстрактного класа, вот таким вот образом, может я что то не правильно понял, я новичок обьясните пожалуйста.
Animal animal= new Animal() {
@Override
public void makeSound() {
}
};
в тоже время при попытке создать обьект при помощи такой конструкции Animal animal= new Animal(); не получается
Вы создали анонимный класс (Урок 35).
Антон такой Антон)))
тебя ни разу не смутила такая конструкция создания))
Вопрос только 1 - когда новые видео?
спасибо
Всём Привет дошол 41 ❤❤❤❤❤❤
Очень хорошие уроки, мне как начинающему очень понятно. Но есть такое дело...я понимаю в чём отличие класса от интерфейса, но если спросить вкратце, можно ответить так?: Интерфейс - контракт, абстрактный класс- контракт со своими условиями в виде собственных реализованных методов.
Да, все верно.
javaRussia спасибо)
Нет,не верно.Если бы автор корректно описал пример с животными, то Вы бы всё правильно поняли,но похоже,что автор и сам не совсем разобрался,раз он так Вам отвечает. Абстрактный класс,как и любой другой класс является чертежом,он описывает свойства объекта.Если мы возьмем конкретно этот пример,то правильно было бы создать переменные name, age, sex,voice(имя,возраст,пол,звук) и создать в этом абстрактном классе абстрактные методы сеттеры и геттеры(позволяют установить или же вернуть эти значения) и те,которые мы потом закинули в интерфейс(makeVoice и eat).Теперь, если мы посмотрим,то все эти методы описывают вообще всех животных,которые только существуют. Переходим к интерфейсам,интерфейс(контракт) - это способность что-то делать.Для более ясного понимания создадим еще один класс Птеродактиль и два интерфейса,первый описывает умение(возможность) ходить по земле, а второй возможность летать.Теперь,все три класса Cat,Dog и Pterodactyl наследуются от Animals т.к. все три ЯВЛЯЮТСЯ животными(это, кстати проверочное слово при наследовании),а вот с интерефейсами дела обстоят по-другому кошка и собака могут ходить,но не могут летать,поэтому имплементируем только первый интерфейс,а вот птеродактиль может как ходить так и летать,поэтому тут имплементируем оба интерфейса. Мы знаем,что в джаве нет множественного наследования,как в С++,но зато мы можем имплементировать сколько угодно интерфейсов,что полностью это компенсирует(Как по мне это удобнее).И вот теперь если у нас появятся новые классы тигр,лев,рысь и воробушек,синичка,ласточка, то мы видим всю мощь полиморфизма в ООП и нам будет очень удобно описать все эти классы.
Получается:
1) абстрактный класс = что-то базовое и большое, мы должны реализовать ВСЕ абстрактные методы, это удобно когда под этот класс попадают все или почти все сущности (например создаем машины, а в абстрактном классе есть абстрактные методы wheels, maxSpeed, doors, color, name и все машины имеют эти аттрибуты, т.е. реализовать все абстрактные методы ЕСТЬ смысл)
2) Интерфейсы = куски описания, которые не всегда пересекаются и их можно комбинировать, например нам нужно описать компьютер. Нет смысла все тулить в абстрактный класс, ведь компьютера бывают разные: ноутбук, домашний ПК, сервер, compute stick. И объекты будут иметь поля: внешний блок питания (большой ПК / сервер), Адаптер питания (ноутбук, маленький компьютер), монитор, встроенный дисплей (ноутбук), DVD-привод (у compute stick нет вообще такого) и т.д., то есть нет смысла все это пихать в абстрактный класс и потом при желании создать объект ноутбука переопределять ненужные методы типо внешнего дисплея, внешнего блока питания и большого корпуса, т.к. это ноутбук и там попросту этого нет. А вместо этого можно реализовать по отдельности интерфейсы ноутбук, домашний ПК, сервер, compute stick, которые уже будут иметь только НУЖНЫЕ методы.
Я правильно рассуждаю?
@@olehanfimov7438 package com.java.lessons.Interfeis;
public class MAN {
public static void main(String[] args) {
Cat c= new Cat();
Dog1 d=new Dog1();
Pterodactil p=new Pterodactil();
c.setAge(5,"Kytti","Girl","MEEEOOOOWWWW");
d.setAge(10,"Fill","Boy","GAV GAV GAV");
p.setAge(100,"Grasy","Boy","KARRRR");
c.Names();c.Ages();c.Sexs();c.Sound();c.Go();c.Swim();
d.Names();d.Ages();d.Sexs();d.Sound();d.Go();d.Swim();
p.Names();p.Ages();p.Sexs();p.Sound();p.Fly();p.Go();p.Swim(); }}package com.java.lessons.Interfeis;
Меня зовут Kytti
Мне 5 лет
я Girl
Я MEEEOOOOWWWW
Kytti walk
Kytti swim
Меня зовут Fill
Мне 10 лет
я Boy
Я GAV GAV GAV
Fil walk
Fill Swim
Меня зовут Grasy
Мне 100 лет
я Boy
Я KARRRR
Pterodactil is flying
Pterodactil on the ground
Pterodactil swim
Process finished with exit code 0
Лайк)
КРАССССААААААААААААВЧИИИИИИИИИИИККККК
так в интерфейсе можно же реализовать те методы, где они будут для всех. +имплиментить можно сколько хочешь, а экстендить только одного. Мне кажется абстрактные методы - устаревшее явление.
ну а как ты в интерфейсе тогда поля будешь задавать? например имя или возраст )
Нашел ответ на вопрос, так для чего оно надо если методы можно и так вызвать:
Это нужно для гарантии того, что в наследуемых классах будет реализован метод с тем же названием и похожим функционалом. Например, у классов Треугольник и Круг должен быть реализован абстрактный метод get_area, который считает площадь. Иначе можно писать в одном классе area, в другом get_area, что вызывает путаницу и проблемы с поддержкой кода. Имхо, думаю это не вся суть:)
Thnx
Блин все равно не понял. Интерфейс это контракт который обязывает реализовать имплементириующие классы все методы которые находятся в интерфейсе. А асбтрактный класс че то не втюрился... Больше похоже на "Вы не понимаете, это другое")))
Каковы различия между абстрактным классом и интерфейсом в Java?
*Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть. private переменные не создашь в виде полей, потому что геттеры и сеттеры к ним не опишешь.
*Абстрактный класс наследуется (extends), а интерфейс - реализуется (implements). Мы можем наследовать только один класс, а реализовать интерфейсов - сколько угодно (Наследование - одно уровневое, Реализация - многоуровневая). Интерфейс может наследовать (extends) другой интерфейс/интерфейсы, но не КЛАССЫ, это запрещено компилятором!
*Абстрактные классы используются, когда есть отношение "is-a", то есть класс-наследник расширяет базовый абстрактный класс, а интерфейсы могут быть реализованы разными классами, вовсе не связанными друг с другом.
Каждый второй пишет, что ему все понято, верю ))). Автору поклон за труд, но по ощущениям тема не раскрыта, примеры слабоваты. Это первый урок, который я пропускаю.
как именно ты его пропускашь?
Super tnx
перфекто !!
01.07.19 Learning....
Возникло несколько вопросов:
Может ли абстрактный класс реализовывать интерфейс?
Может ли класс потомок реализовывать отличный от родительского класса интерфейс или только те что прописаны у предка?
Может ли класс одновременно extends и implements?
Опишите использование полей(не статических и статических) в абстрактном классе и интерфейсе.
В абстрактном классе можно объявить статические и не статические поля, в интерфейсах только константы.
Кешан
"только константы"
НИХ*Я не понял..но очень интересно
Как успехи?
2:23 доуя абстрактный штоле?!
Ничего не сказано про поля абстрактного класса, поэтому имхо столько непонимания в камментах
Вообще ниче не понятно, пересмотрел раз 10, исходя из урока только 1 вывод- интерфейсы и абстрактные классы это тож самое, просто если тебе надо чтобы были реализованы все методы- выбирай интерфейс, если тебе надо чтобы было реализовано много методов , но не все, можешь использовать абстрактные класс
не фига не понятно
))))
ох уж этот кринжовый акцент со словом ЭБСТРАКТ я больше не можу
материал прям ерунда и про интерффейсы прям тупые реализациии, сам не понимаеш и других не путай.
Поищите еще что в инете, про интерфейс,не забивайте голову... не слушайте про контракт, он в ушах плеш проел .
, но так тяжело слушать этот "а ля бритиш акцент", на хрена он нужен? этот "аабшштээракт", если другие слова тупа рубиш по русскому акценту class-класс , animals -анималс.
или этот ." interface" -интерфейс... ,а почему не "Энтэрфайсзе"... - или не "Иинтэ файcе" как есть правильно )))
икстати и у них abstract - и произносится "абстракт".
Ха-ха
Вот это у тебя бомбит, малыш =D
ну пользы от твоего коммента ноль
"поищите еще что в инете" - то что доктор прописал
Спасибо!
Спасибо!
Спасибо 🎉