Когда использовать статическое связывание, а когда использовать динамическое связывание в Java?
Недавно я учусь использовать Slf4j. И я знаю две новые концепции: статическое связывание и динамическое связывание. В JCL(Jakarta Commons Logging) оно использует динамическое связывание, чтобы выбрать реализацию, в то время как Slf4j использует статическое связывание. В этом случае мы знаем, что Slf4j более мудрый. Но как насчет другого случая?
Если мы сталкиваемся с проблемой, которую мы можем решить как с помощью статического связывания, так и с помощью динамического связывания, то как мы выбираем? Есть ли основные правила?
Мой английский не очень хороший. Так что я не уверен, ясно ли я дал понять. Если у вас есть еще вопросы, пожалуйста, прокомментируйте.
СПАСИБО.
1 ответ
Здесь: Ссылка
Немного важного различия между статическим и динамическим связыванием
1) Статическое связывание в Java происходит во время компиляции, тогда как динамическое связывание происходит во время выполнения.
2) закрытые, конечные и статические методы и переменные используют статическое связывание и связываются компилятором, тогда как виртуальные методы связываются во время выполнения на основе объекта времени выполнения.
3) Статическая привязка использует информацию о типе (класс в Java) для привязки, а динамическая привязка использует объект для разрешения привязки.
3) перегруженные методы связываются с использованием статического связывания, а переопределенные методы связываются с использованием динамического связывания во время выполнения.
Пример статического связывания в Java
public class StaticBindingTest
{
public static void main(String args[])
{
Collection c = new HashSet();
StaticBindingTest et = new StaticBindingTest();
et.sort(c);
}
//overloaded method takes Collection argument
public Collection sort(Collection c)
{
System.out.println("Inside Collection sort method");
return c;
}
//another overloaded method which takes HashSet argument which is sub class
public Collection sort(HashSet hs)
{
System.out.println("Inside HashSet sort method");
return hs;
}
}
Вывод: метод сортировки внутри коллекции
Пример динамического связывания в Java
public class DynamicBindingTest
{
public static void main(String args[])
{
Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car
vehicle.start(); //Car's start called because start() is overridden method
}
}
class Vehicle
{
public void start()
{
System.out.println("Inside start method of Vehicle");
}
}
class Car extends Vehicle
{
@Override
public void start()
{
System.out.println("Inside start method of Car");
}
}
Вывод: метод внутреннего запуска автомобиля