2016-10-11 16 views
0

最近我正在学习如何使用Slf4j。我知道两个新概念:静态绑定和动态绑定。在JCL(Jakarta Commons Logging)中,它使用动态绑定来选择实现,而Slf4j使用静态绑定。 在这种情况下,我们知道Slf4j更明智。但其他情况如何?何时使用静态绑定以及何时使用Java中的动态绑定?

如果我们遇到一个问题,我们可以通过使用静态绑定和动态绑定来解决它,那我们该如何选择?有没有基本的规则?

我的英语不是很好,所以我不确定我是否已经说清楚了。如果您有更多问题,请发表评论。

THX。

+0

你可以使用'instanceof'希望你知道关于多态语句 –

回答

0

这里:Link

很少之间的静态和动态结合

1重要的区别)静态在Java绑定在编译时期间发生而动态绑定运行期间发生。

2)private,final和static方法和变量使用静态绑定并由编译器绑定,而虚拟方法在运行时基于运行时对象绑定。

3)静态绑定使用Type(Class in Java)信息进行绑定,而Dynamic binding使用Object来解析绑定。

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

输出:在内部启动汽车的方法

+0

Thx为你的答案。但我想说我知道不同之处。我想知道如何选择像Slf4j一样,当它决定使用哪一个来绑定实现。 JCL使用动态但Slf4j使用静态。你懂吗? –

+0

编译时间错误总是比运行时错误好。更好的做早期绑定而不是后期绑定,以便了解在编译时遇到的问题 – Wearybands