Подтвердить что ты не робот

В чем разница между статической и динамической привязкой?

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

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

4b9b3361

Ответ 1

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

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!
}

Ответ 2

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

Более подробную информацию и ссылки см. в статье Wikipedia по Виртуальные таблицы.

Ответ 3

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

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

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

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

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

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

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;
    }
}

В приведенном выше коде существуют два метода "Area" с разными параметрами. Этот сценарий квалифицируется как перегрузка функций.

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

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

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

Так как во время компиляции 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, оно называется Динамическое связывание (или полиморфизм времени выполнения).

Ссылка для исходного ответа

Ответ 4

Статическое связывание: это процесс разрешения типов, членов и операций во время компиляции. Например:

Car car = new Car();
car.Drive();

В этом примере компилятор выполняет привязку путем поиска метода Drive параметров на объекте car. Если не нашел этот метод! ищите методы, принимающие необязательные параметры, и если этот метод не найден, снова ищите базовый класс Car для этого метода, а если метод не был найден, этот метод снова ищет методы расширения для типа Car. Если совпадений не найдено, вы получите ошибку компиляции!

В этом случае привязка выполняется компилятором, и привязка зависит от статического знания типа объекта. Это делает статическую привязку.

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

dynamic d = new Car();
d.Drive();

Динамический тип сообщает компилятору, что мы ожидаем, что тип времени выполнения d будет иметь метод Drive, но мы не можем доказать это статически. Поскольку d является динамическим, компилятор откладывает привязку Drive к d до времени выполнения.

Динамическое связывание полезно в случаях, когда во время компиляции мы знаем, что определенная функция, член операции существует, но компилятор не знал! Это обычно происходит, когда мы взаимодействуем с динамическими языками программирования, COM и отражением.

Ответ 5

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

Ответ 6

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

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

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

ОБРАТНАЯ СВЯЗЬ ВРЕМЕНИ: - (ВРЕМЯ ПЕРЕВОДА) Он состоит из следующего.

  • Связывание, выбранное программистом.
  • Связывание, выбранное переводчиком.
  • Связывание, выбранное загрузчиком.