我在网上看的一个java教学视频,是关于HashMap的,里面涉及到向上转型的问题,我把代码修改了,代码如下:
HashMap<String,String> hashMap = new HashMap <String,String>();
//Map<String,String> map = hashMap;


hashMap.put("1","abcd");
hashMap.put("2","ef");
hashMap.put("3","ghm");
hashMap.put("4","Dalian");

int size=hashMap.size();
System.out.println("the size of map is-->"+size);
String str=new String();
str=hashMap.get("4");
System.out.println(str);
hashMap.put("4","Wuhan");
str=hashMap.get("4");
System.out.println(str);
这个是能正常编译运行的,并且和原来结果一样。原来的程序中,有Map<String,String> map = hashMap;这一句,
并且,下面的对象都是用map,
我不明白为什么要加这一句,直接用hashMap调用方法不就可以了吗?Java转型HashMapString

解决方案 »

  1.   

    这个跟java面向对象的特性有关,是多态的表现特点。如果不用向上转型,你代码方法的利用率就低了。
      

  2.   

    比如写一个方法,参数要求传递List类型,你就可以用List list = new ArrayList()中的list传递,但是你写成ArrayList list = new ArrayList()是传递不进去的。尽管方法处理时都一样。另外,方法还可以根据你传递的不同list(ArrayList或者LinkList)进行不同处理。
      

  3.   

    上面的两句其实就是这一句  Map<String,String> map = new HashMap <String,String>();
    父类的引用指向子类的对象  这个是为你后面学多态做铺垫的  我当初也是这样的   你见多了就好了  当然你后面理解了多态就懂了 这样写的好处   
      

  4.   

    接口的回调。声明的时候一般都是用接口的。HashMap是Map的一种实现。
      

  5.   

    多态方式声明是一种好的习惯。当我们创建的类,使用时,只用到它的超类或接口定义的方法时,我们可以将其索引声明为它的超类或接口类型。它的好处是,如果某天我们对这个接口方法的实现方式变了,对这个接口又有一个新的实现类,我们的程序也需要使用最新的实现方式,此时只要将对象实现修改一下,索引无需变化。比如Map<String,String> map = new HashMap <String,String>();想换成HashTable实现,可以Map<String,String> map = new HashTable <String,String>();这种小范围的使用可能体现的用处不明显。当我们使用Spring,或者设计数据库连接使用时,可能会明显些。我们可能会随着业务发展,数据库的实现从mySql改为Oracle等。如果我们设计的时候,将数据库驱动的索引直接定义为mySql特定的驱动时,切换Oracle就要修改源码了。如果定义为接口的方式,如Dirver等,此时的切换,只要修改配置文件数据库驱动即可,源码中对数据库的各种操作都无需修改。
      

  6.   

    这明显是声明父类创建子类的实例啊,Map<String,String> map = new HashMap <String,String>();
    是一个道理
      

  7.   

    赞同楼上说的,是Java多态的表现。建议你有空看看《Java编程思想》
      

  8.   

    那个讲的是多态,那样写,那么在以后要改实现方式的时候就更容易了,假如要改成TreeMap
      

  9.   

    =================
    直接传递也是可以的
    import java.util.Hashtable;
    import java.util.Map;public class TestUpTrans
    {
        public static void main(String[] args)
        {
            Hashtable hash = new Hashtable();
            hash.put("001", "001");
            hash.put("002", "002");
            printSize(hash);
        }
        
        private static void printSize(Map map)
        {
            System.out.println(map.size());
        }
    }
    该类中main方法执行的结果就是【2】