最近我正在学习如何使用Slf4j。我还知道了两个新概念:静态绑定和动态绑定。在JCL(Jakarta Commons Logging)中,它使用动态绑定来选择实现,而Slf4j使用静态绑定。在这种情况下,我们知道Slf4j更明智。但是其他情况呢?
如果我们遇到一个问题,我们可以解决它使用静态绑定和动态绑定,那么我们如何选择?有什么基本的规则吗?
我的英语不是很好。所以我不确定我是否讲清楚了。如果你还有问题,欢迎评论。THX .
此处:链接
静态绑定和动态绑定的几个重要区别
1) Java中的静态绑定发生在编译时,而动态绑定发生在运行时。
2) private、final和static方法和变量使用静态绑定并由编译器绑定,而virtual方法在运行时基于运行时对象绑定。
3)静态绑定使用类型(Java中的类)信息进行绑定,而动态绑定使用对象来解析绑定。
重载的方法使用静态绑定,重载的方法在运行时使用动态绑定。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");
}
}
输出:汽车内部启动方法