Как понять, будет ли bevvior использовать статическое или динамическое связывание в Java? - PullRequest
7 голосов
/ 06 декабря 2010

На низком уровне я понимаю, что статические (время компиляции) и динамические (время выполнения) привязки равны .

Я до некоторой степени понимаю, почему важно знать, что (например,тот факт, что генерики разрешаются статически, помогает объяснить, что вы можете и не можете делать и т. д.)и динамическое связывание для переопределенных.Это почему?Это выбор дизайна, это то, что очевидно и неизбежно для людей, которые понимают глубокое функционирование Java, или это то, что нужно изучать (а не понимать)?

Ответы [ 3 ]

3 голосов
/ 06 декабря 2010

Вопрос в том, как компилятор может узнать, какой метод вызывать во время компиляции, в случае переопределения. Вы должны это понять,

List list = list.getAList();
list.add(whatever);

Теперь предположим, что метод getAList() может возвращать любую из нескольких реализаций List на основе некоторых критериев. Таким образом, как компилятор может знать, что возвращена какая реализация? и какой add() метод вызывать. Как видите, это может быть решено только во время выполнения. Принимая во внимание, что при перегрузке это не так, и все ясно во время компиляции. Я надеюсь, вы понимаете это сейчас.

[Изменено]

Приведение обсуждения в комментариях к фактическому ответу.

Это не может быть известно до времени выполнения. Поймите это следующим образом: создание экземпляра определенного класса зависит от аргумента, предоставленного пользователем. Теперь скажите мне, как компилятор будет знать, какой аргумент передается пользователем и, по-видимому, какой класс создавать. Или, проще, ответьте на этот вопрос: как компилятор узнает, будет ли поток передан в блок if или else? Или почему вы думаете, что мы проверили и исключения во время выполнения? Возьмите случай divide-by-zero; например n/m, где m становится 0 в результате некоторого вычисления. В этом случае очевидно, что компилятор не сможет сказать, что будет ArithmeticException, потому что m не известен сразу. Поскольку вся эта информация недоступна во время компиляции, таким образом, компилятор, точно так же, не знает, какой метод заменит какой.

1 голос
/ 06 декабря 2010

Динамическое связывание - для случаев, когда вы переопределяете методы, потому что во время выполнения необходимо будет решить, какой метод (код) выполнить, основываясь на типе выполнения объекта.С перегруженным методом вам не нужно выбирать во время выполнения, вы можете выяснить во время компиляции, какой метод будет вызываться.Это приведет к более быстрому выполнению.

0 голосов
/ 06 декабря 2010

По-моему, я думаю, что это по очевидной причине ... Перегрузка - это то, что компилятор понимает во время компиляции, а переопределение - поздняя привязка или время выполнения .... Понимание концепции ООП может помочь вам ..

...