Раннее и Позднее Связывание
ฝัง
- เผยแพร่เมื่อ 31 ก.ค. 2015
- Раннее и Позднее связывание характеризует то, как действуйт программа при вызове функций на объекте подкласса через указатель на суперкласс.
Эти понятия также часто называются статической и динамической типизацией.
Спасибо! Лучший стиль преподавания! Если бы так в универах преподавали ...
В почти универе так) как я понял из вступления)
Так доходчтво тему позднего связывания никто не обьяснял.❤
Самое лучшее объяснение, которое встречал
Спасибо 🖐️Искал аналогию virtual-метода в java, и, как оказалось, в java все методы виртуальные и нет надобности в отдельном кейворде аля virtual. И Володя это же рассказал. Прикольно)
Володя, ты выносишь мне мозг, благодарю)))
Отлично рассказываете. Единственное хотел увидеть больше примеров, не только с виртуальными функциями, но и динамически создаваемыми объектами и указателями.
Не могу не оставить комментарий , я не программист в прямом смысле , занимаюсь управлением промышленного оборудования, но стало то время когда приходится освоить немного классического из пк , ролики просто офигенные и мне понятные , в любом случае весь принцип написания кода повторяет друг друга вне зависимости от среды написания что облегчает понимания :)
Молодец. Однозначно подписываюсь.
Очень понравилось.
Спасибо, Володя. Хорошо объяснил. :)
Каеф) Супер доступно, даже для того, как я) Спасибо)
Круто! Все встало на свои места!
спасибо Вам. Уяснил разницу.
мужик красава! я тугодум даже понял!
Правильный Володя. Лайк и подписка👍
Спасибо огромное!!!
я подписался с удовольствием!
Спасибо!
в rust есть zero cost abstraction благодаря которому не происходит поиска метода во время исполнения проги
Человечище!)
*когда во время исполнения??? во время вызова или во время загрузки??? или во время создания экземпляра класса???*
Здравствуйте.
Подскажите, пожалуйста, Вы говорите, что динамическая типизация = позднее связывание. Но ведь Java - это язык со статической типизацией и поздним связыванием (в большинстве случаев).
Т.е. как-то неодназначно.
javarush.ru/groups/posts/439-razlichija-mezhdu-rannim-i-pozdnim-svjazihvaniem-v-java
в Java 2 типа связывания: раннее, если методы static, private или final. В остальных позднее
@Боня Ферзь Но не логично для С++ так как там virtual может быть private.
четко объяснил. не прибавить не убавить. если твои падаваны тебя не понимут, то им в детсад надо.
Спасибо большое. Но есть один момент с таким примером из-за которого он у меня не работал. Нужно чтобы функция принимала ссылку, иначе все равно вызовет метод родителя. Видимо если передавать по значению то при копировании что-то идет не так.
Могу ошибаться, но если логически рассуждать, то если вы создаете функцию вида
int foo(A a);
то в момент вызова функции будет создан временный объект класса A, в него будет скопирована часть объекта b, которая относится к классу А. И именно эта копия будет использоваться в функции. А так как копия всегда является типом класса А, то и не должно возникать вопроса, функцию какого класса вызывать.
Если вы создаете функцию вида
int foo(A& a);
и передаете объект класса B, то при вызове функции создания нового временного объекта производится не будет, а будет просто передана ссылка (можно воспринимать как нейкий абстрактный указатель) на уже имеющийся объект. И этот объект может быть любого дочернего типа со ссылками на свои же виртуальные функции. Поэтому тут есть возможность вызвать виртуальную функцию данного типа объекта.
а еще проще это называется усечением типа
Автор, правы ли вы называя ранее связывание статической типизацией? Думаю нет. Вот если бы назвали статическим связыванием , то считаю было бы верно. Ведь статическая типизация это совсем иное, и кстати, Java статически типизированный язык (с динамическим связыванием, хотя статическое связывание в java тоже есть). Статическая типизация это когда мы в момент объявления знаем тип объекта, например String str; А есть языки в которых этот тип не пишется, это языки с динамической типизацией. Вывод: то о чем вы говорите называется статическое и динамическое связывание и в java все таки есть и статическое связывание тоже. Казалось бы ну откуда в Java раннее связывание? А как же статические методы? вот пример, javarush.ru/groups/posts/439-razlichija-mezhdu-rannim-i-pozdnim-svjazihvaniem-v-java где показывается существование статического связывания и кстати JVM помечает такие методы и с помощью спец команд можно увидеть эти пометки в консоли.
В видео перепутаны такие понятия, как типизация (typing) и диспетчеризация (dispatch).
Не могли бы вы привести пример в котором использовалось бы раннее связывание? Где может быть применим такой способ связывания? Как вы уже говорили, во многих языках такой возможности нет вовсе - бывают ли ситуации, в которых есть острая потребность в раннем связывании, или такая возможность представляет скорее академический интерес?
Java static, final, overload, все - раннее связывание
А как же в Java статические и приватные методы, они же не являются виртуальными,так получается не все связывание в Java позднее?
Да, судя по информации в интернете (в идеи надо в документацию к Джаве лезть), приватные методы, статические методы, методы, помеченные модификатором final, и конструкторы используют раннее связывание.
@@maxlich9139 у java есть документация? 😳
@@june3878 а куда она делась? О_о
@@maxlich9139 это нельзя назвать документацией)
а что можно назвать документацией?
Это тоже самое что компайл и рантайм полиморфизм?
круто) такого наставника бы в работе
Я занимаюсь репетиторством через интернет... если что.
А в языке С тоже есть динамическая типизация?
Крутое видео
Бог компуктеров!!!
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
и static
Объяснения: уровень Бог
В java есть статическое/раннее связывание
Помоему это больше к полиморфизму относится, а не к связыванию. К примеру в .NET к позднему связыванию относится загрузка сборок во время выполнения программы и инстанциирование типов находящихся в них с последующим использованием их функционала. Поправьте если я не прав.
Антон Самошин Дело в том, что я .NET не знаю, так что не совсем понимаю о чём идёт речь. Можете объяснить что такое "сборки".
Vladimir Mozhenkov сборка в данном варианте просто обычная dll которая подгружается во время работы программы. К примеру у нас есть некий графический редактор, а в отдельной dll лежит какой нибудь плагин к нему и на этапе работы программы пользователь подгружает эту dll и задействует ее функционал (вызываются методы/функции классов из этой dll) тем самым осуществляется позднее связывание
Антон Самошин Ясно вы про компиляцию и использование библиотек. Это не только в .NET - это везде так, но я никогда не слышал чтобы это называли ранним и поздним связыванием. Термины, которые мне всегда встречались - это статическое и динамическое связывание.
В IT вообще очень часто бывает, что одни и те-же слова используются поразному в зависимости от контекста. И плюс тут ещё вопрос английского и русского языков.
Когда начал читать ваш первый комментарий, подумал, что может вы говорили про ленивую инициализацию, которую также называют поздней иногда. Это опять-же совершенно другое понятие, никак не связаное с тем, о чём я говорил в этом конкретном видео.
ну я хз, когда в конце чувак говорит "с вопрсами зачем это" это не сюда это по моему не ок. можно было и какой нибудь пример на пальцах показать) там массив разных зверей стандардатный или что там показывают. не все же сразу сообразят где на практике это исползовать
Было бы неплохо если бы Вы нумеровали видео, тогда было бы понятно в какой последовательности смотреть.
Ох как же этого не хватает!
Я не понимаю, как foo(A a) вызывает a->get()
Например так:
foo(A a)
{
a.get();
}
видимо нужно для скорости
Немного понял, но не совсем
Поздняя типизация. ОК.
public class Test {
public static void main(String[] args) {
A a = new B();
int get = a.get();
String foo = a.foo();
System.out.println("get: " + get);
System.out.println("foo: " + foo);
}
}
class A {
public int get() {
return 100;
}
public static String foo() {
return "foo1";
}
}
class B extends A {
public int get() {
return 200;
}
public static String foo() {
return "foo2";
}
}
get: 200
foo: foo1
все верно в Java раннее связывание будет если метод static, final, private
Посмотри на оформление своих видео в листинге и скажи: о чем оно? Посмотри на описание своего видео? и скажи: о чем видео то? Я только из комментов понял, что речь про Java...
какая джава?! он использует язык с++
вот и я про то же)) даже из комментов нихера не понятно о чем речь идет=)) гений маркетинга) код документирует наверное так же))
Да, это минус, что он не указывает язык. Я давно изучал си++ и уже не сильно хорошо помню его синтаксис, поэтому смотрю на год, и гадаю, какой это язык (а сейчас там много си-подобных языков)
Причем здесь язык? Это понятия из ООП, которые относятся к любому ООП языку.
Метод потомка вызовется, если метод переопределён, если метод не переопределён или перегружен, или имеет модификаторы (private,static,final) вызовется метод родителя родителя!!!!!!!!!!! ЧЁ орать то!!!ГЫЫЫ!!!
Да, уж и зачем я связался.