今天看别人的源代码发现如下:
[code]
private static Map table = new Hashtable();
[/code]我知道,table 是一个Map接口,Hashtable 是该接口的实现类。但是为什么不直接定义成:
[code]
private static Hashtable table = new Hashtable();
[/code]他这么写有什么好处?或者有什么意思我没发现的?各位大大帮帮忙,指教一下。

解决方案 »

  1.   

    晕代码没出来,再发次:今天看别人的源代码发现如下: private static Map table = new Hashtable();我知道,table 是一个Map接口,Hashtable 是该接口的实现类。 但是为什么不直接定义成: private static Hashtable table = new Hashtable();他这么写有什么好处?或者有什么意思我没发现的?各位大大帮帮忙,指教一下。
      

  2.   

    这样可以实现接口和实现相分离。
    因为map接口可以有很多实现类,如果这样
    private static Hashtable table = new Hashtable(); table就只能引用Hashtable 类了而不能引用其他类
    比如Hashmap也是map的 实现类
    如果你在定义private static Hashtable table = new Hashmap();这样不成了,table就不能引用Hashmap了
    因为Hashtable和Hashmap是不同的类
    但是如果你用接口定义
    private static Map table = new Hashtable(); 
    你就可以用table再引用其他的Map实现类
    private static Hashtable table = new Hashmap();再这样写就没错了
    这样table就可以引用Map的不同子类了
      

  3.   

     面向接口编程,依赖于接口,而不依赖于实现(接口的实现类)可扩展。
    比如:private Map map = null;public void setMap(Map m) {
    this.map = m;
    }在调用setMap方法的时候,你可以传入任何实现了Map接口的类!假如你一开始用的Hashtable ,后来你想改成HashMap
    这个类的代码你根本就不用动。如果这样:
    private Hashtable map = null;public void setMap(Hashtable m) {
    this.map = m;
    }这样在调用setMap的时候,你只能传入Hashtable类型的对象!
    如果想传入别的类型的,你只能再去更改这个类的代码。你说哪个好呢?实在想不出来那有什么好处的话,你就这么想吧:“多一种选择总是好的,用Map的话你就有多种选择,而写死了Hashtable,你就只有这一种选择”!
    呵呵。