2009-03-13 2 views
23

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

Не могли бы вы привести краткий пример каждого, чтобы еще раз его проиллюстрировать?

+1

Если это домашнее задание, вы будете лучше просить критика запланированного ответа; а не для ответа. –

+2

@ Даниэль Л, я отметил это как домашнюю работу. Это не прямо вопрос в моей домашней работе. Я должен классифицировать кучу вещей как статические или динамические, и я пытаюсь прояснить в голове, что именно по этому вопросу. Если люди захотят ответить, они это сделают. – KingNestor

+0

@KingNestor: Да, я видел, что это была домашняя работа;] Я понимаю, что вы сейчас имеете в виду. –

ответ

26

В наиболее общих чертах статическое связывание означает, что ссылки разрешены во время компиляции.

Animal a = new Animal(); 
a.Roar(); // The compiler can resolve this method call statically. 

Динамическое связывание означает, что ссылки разрешаются во время выполнения.

public void MakeSomeNoise(object a) { 
    // Things happen... 
    ((Animal) a).Roar(); // You won't know if this works until runtime! 
} 
+1

Неверно, если объект a = новый Animal(); –

+0

Правда, хотя я думаю, что было очевидно, что я пытался быть генералом. Я немного поправился. –

+3

Ваш последний пример по-прежнему является статическим привязкой. Приказ типа может или не может быть успешным, но если приведение типов будет успешным, даже если 'Roar' является виртуальным методом, код будет привязан к слоту vtable, статически связанному с' Animal.Roar() '. Динамическое связывание происходит только в C# при использовании нового типа 'dynamic', или с помощью Reflection (например,' a.GetType(). GetMethod («Roar»). Invoke (a, null) '). Последний будет работать с любым типом, который реализует безпараметрический метод под названием «Roar» и возвращает самую производную реализацию (даже если базовая реализация не является виртуальной). – supercat

6

Это зависит от того, когда происходит связывание: во время компиляции (статическое) или во время выполнения (динамическое). Статическое связывание используется, когда вы вызываете простой метод класса. Когда вы начнете разбираться с иерархиями классов и виртуальными методами, компилятор начнет использовать так называемые VTABLE. В то время компилятор не знает точно, какой метод вызывать, и ему нужно дождаться времени выполнения, чтобы выяснить правильный метод, который нужно вызвать (это делается через VTABLE). Это называется динамическим связыванием.

См. Статью в Википедии о Virtual tables для получения более подробной информации и ссылок.

-4

Связывание, выполняемое во время компиляции, является статической привязкой и привязкой, выполняемой во время выполнения, является динамической привязкой. В статическом типе данных привязки указатель разрешает какой метод вызывается. Но в динамическом связывании тип данных объекта решает, какой метод вызывается ,

-4

* Время выполнения: - * привязки переменных к его значениям, а также привязка переменной к определенному месту хранения во время выполнения называется привязкой времени выполнения.

МОЖЕТ БЫТЬ ДВУХ ВИДОВ

  1. на входе в подпрограмму.
  2. В произвольных точках во время выполнения.

скомпилирован ОБЯЗАТЕЛЬНОЕ: - (ПЕРЕВОД ВРЕМЯ) Он состоит в следующем.

  1. Связывание, выбранное программистом.
  2. Связывание, выбранное переводчиком.
  3. Переплет, выбранный загрузчиком.
1

Я пришел на этот прекрасный ответ пользователя quora "Monis Yousuf". Он это прекрасно объясняет. Я помещаю его здесь для других.

Связывание в основном представляет собой концепцию объектно-ориентированного программирования, связанного с полиморфизмом.

Во-первых, понять, что такое Полиморфизм есть. Книги говорят, что это означает «одно имя и несколько форм». Правда, но слишком абстрактно. Возьмем пример из реальной жизни.Вы идете к «Доктору», врач может быть специалистом по зрению, специалистом по ЛОР, нейрохирургом, гомеопатом и т. Д.

Здесь «врач» - это имя и может иметь несколько типов; каждый из которых выполняет свою собственную функцию. Это полиморфизм в реальной жизни.

Функция Перегрузка: Эта концепция изображает статическое связывание. Перегрузка функций может быть грубо определена, поскольку два или более метода (функции), которые имеют одинаковое имя, но разные сигнатуры (включая количество параметров, типы параметров, разные типы возврата), называются перегруженными методами (или функциями).

Предположим, вам нужно рассчитать площадь прямоугольника и круга. См. Ниже код: -

class CalculateArea { 

    private static final double PI = 3.14; 

    /* 
     Method to return area of a rectangle 
     Area of rectangle = length X width 
    */ 
    double Area(double length, double width) { 
     return (length * width); 
    } 

    /* 
     Method to return area of circle 
     Area of circle = π * r * r 
    */ 
    double Area(double radius) { 
     return PI * radius * radius; 
    } 
} 

В приведенном выше коде есть два метода «Площадь» с различными параметрами. Этот сценарий квалифицируется как перегрузка функций.

Теперь, придя к реальному вопросу: как это статическое связывание?

Когда вы вызываете какие-либо из вышеуказанных функций в вашем коде, вы должны указать параметры, которые вы передаете. В этом случае, вы пройдете либо:

  • два параметра типа двойного [который будет вызывать первый метод, чтобы стоимость являются прямоугольника]
  • один параметр типа двойного [который будет вызывать второй метод, чтобы вычислить площадь круга]

Так как во время компиляции java-компилятор может определить, WHICH функция для вызова, это привязка времени компиляции (или STATIC).

Переопределение функции: переопределение функции - это концепция, которая показана в наследовании. Его можно грубо определить как: когда есть метод, присутствующий в родительском классе, и его подкласс также имеет тот же метод с SAME-сигнатурой, он называется переопределением функции. [Есть еще что-то, но для простоты я написал это определение] Это будет легче понять с помощью кода ниже.

class ParentClass { 
    int show() { 
     System.out.println("I am from parent class"); 
    } 
} 

class ChildClass extends ParentClass{ 
    int show() { 
     System.out.println("I am from child class"); 
    } 
} 

class SomeOtherClass { 
    public static void main (String[] s) { 
     ParentClass obj = new ChildClass(); 
     obj.show(); 
    } 
} 

В коде выше, метод show() в настоящее время переопределен в одной и той же подписи (имя) и присутствует в обоих родительских и дочерних классов.

В третьем классе, SomeOtherClass, ссылочная переменная (obj) типа ParentClass содержит объект ChildClass. Далее, метод show() вызывается из той же ссылочной переменной (obj).

Снова, тот же вопрос: как это динамическое связывание?

Во время компиляции компилятор проверяет, что ссылочная переменная имеет тип ParentClass и проверяет, существует ли способ show() в этом классе. Как только это будет проверено, компиляция будет успешной.

Теперь, когда программы RUNS, он видит, что объект имеет номер ChildClass и, следовательно, он выполняет метод show()ChildClass. Поскольку это решение принято на RUNTIME, оно называется Динамическое связывание (или полиморфизм времени выполнения).

Link за оригинальный ответ

Смежные вопросы