A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pphdsny3 高级黑马   /  2012-8-15 14:29  /  1988 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马王鹏 于 2012-8-15 14:33 编辑
  1. import java.util.*;

  2. public class MapDemo {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 Map<String,String> m = new HashMap<String,String>();
  9.                //疑问:Map不是接口么?为什么可以成为new HashMap的对象实例呢?
  10.                 m.put("01", "wp5");
  11.                 m.put("02", "wp2");
  12.                 m.put("03", "wp3");
  13.                 System.out.println(m);               
  14.         }
  15. }

复制代码

6 个回复

倒序浏览
Map是接口,我们不能直接new一个Map的实例,
但是我们可以new一个Map的实现类,如HashMap或TreeMap,然后用Map来接收这个实现类
这也是一种多态的体现,这种是面向接口编程的一种好习惯,方便以后的扩展和更新。
比如你现在new了一个HashMap的实例,下次想要换TreeMap,只要需要修改实现类,
而不用修改父类,这样非常方便。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 周瑞 于 2012-8-15 14:45 编辑

HashMap是基于哈希表的 Map 接口的实现的。所以可以用map来申明对象,而它的实例化可以由HashMap实现。
这样做的原则是依赖倒置原则。
回复 使用道具 举报
这也是一种多态的体现。
1,多态的体现
  父类或者接口的引用指向或者接收自己的子类对象。
2,多态的前提
  必须是类与类之间有关系,要么继承,要么实现。
  通常还有一个前提:就是存在覆盖。
3,多态的好处
  多态的出现大大提高了程序的扩展性和后期可维护性。
4,多态的弊端:
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用
   匿名内部类等。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油

查看全部评分

回复 使用道具 举报
package exception;
import java.util.HashMap;
import java.util.Map;
interface AAA{
public void say();
}
class BBB implements AAA{
public void say(){
  System.out.println("hello boy");
}
public void show(){
  System.out.println("watching");
}
}
public class TestMap {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  Map<String, String> m = new HashMap<String, String>();
  // 疑问:Map不是接口么?为什么可以成为new HashMap的对象实例呢?
  /**
   * Map的确是接口,但是HashMap实现了Map,即Map里面的非私有方法,HashMap都已经实现了
   * 此处m引用HashMap对象,相当于上转型对象,(这种对象只能操作Map里面有的函数,而不能操作Map里没有而HashMap里有的函数)这就是多态的体现
   * 多态的体现:父类引用指向子类对象;父类的引用也可以接受自己子类的对象
   * 多态的前提:必须类与类之间有关系,要么是继承关系,要么是实现关系;通常还有一前提,存在覆盖
   * */

  m.put("01", "wp5");
  m.put("02", "wp2");
  m.put("03", "wp3");
  System.out.println(m);
  AAA aa = new BBB();
  aa.say();
  //aa.show();//调用子类特有的方法,编译通不过
}
}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油

查看全部评分

回复 使用道具 举报
谢谢大家,基本知道是这么回事了!!问题已解决!
回复 使用道具 举报
父类引用指向子类对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马