黑马程序员技术交流社区

标题: 关于接口的一些疑问 [打印本页]

作者: pphdsny3    时间: 2012-8-15 14:29
标题: 关于接口的一些疑问
本帖最后由 黑马王鹏 于 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. }

复制代码

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

作者: 周瑞    时间: 2012-8-15 14:42
本帖最后由 周瑞 于 2012-8-15 14:45 编辑

HashMap是基于哈希表的 Map 接口的实现的。所以可以用map来申明对象,而它的实例化可以由HashMap实现。
这样做的原则是依赖倒置原则。
作者: 郑彬    时间: 2012-8-15 14:46
这也是一种多态的体现。
1,多态的体现
  父类或者接口的引用指向或者接收自己的子类对象。
2,多态的前提
  必须是类与类之间有关系,要么继承,要么实现。
  通常还有一个前提:就是存在覆盖。
3,多态的好处
  多态的出现大大提高了程序的扩展性和后期可维护性。
4,多态的弊端:
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
5,多态的应用
   匿名内部类等。
作者: 张忠豹    时间: 2012-8-15 14:56
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();//调用子类特有的方法,编译通不过
}
}


作者: pphdsny3    时间: 2012-8-15 15:05
谢谢大家,基本知道是这么回事了!!问题已解决!
作者: 杨宗彬    时间: 2012-8-15 18:46
父类引用指向子类对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2