下午看李刚的疯狂java一书,里面有一段代码是Collection books = new HashSet();
books.add("第一本书");
books.add("第二本书");
books.add("第三本书");
后面省略了……
Collection books = new HashSet();这句是什么意思啊?Collection不是一个接口吗?为什么能创建了一个Collection对象?
另外,要创建也应该是HashSet books = new HashSet();或者Collection books = new Collection();啊?
但是我编译没有书上的语句没有错误,这是怎么回事啊?JavaCollectionHashSet

解决方案 »

  1.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
      

  2.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?
      

  3.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?Collection books = new HashSet();
    使用这种写法体现的是java的多态性,楼主可以查查。
      

  4.   

    这样使用多态有个好处,就是哪天我不想用HashSet实现,想换ArrayList实现,前面的定义就可以不改了,直接换成Collection books = new ArrayList();当然,这里只替换一处,不是很明显。当然,使用多态的一个前提是,只使用定义类型内的方法(本例就是只用了Collection的add方法)。
      

  5.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?Collection books = new HashSet();
    使用这种写法体现的是java的多态性,楼主可以查查。
    嗯,我知道这是多态,呃。
    还有一个问题就是为什么 对象c不能使用ArrayList里的方法?这个c难道不是ArrayList的实例吗
      

  6.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?Collection books = new HashSet();
    使用这种写法体现的是java的多态性,楼主可以查查。
    嗯,我知道这是多态,呃。
    还有一个问题就是为什么 对象c不能使用ArrayList里的方法?这个c难道不是ArrayList的实例吗
    哪有对象c? ArrayList的实例可以实现ArrayList的方法的
      

  7.   

    这是多态,这样做的好处很多,举个你以后学javaWeb会学到的例子吧。servlet 是阿帕奇公司定义的接口,里面的方法,以及方法的作用都是定义好了,但是没有实现。具体的实现是由web容器来实现的,比如Tomcat JBOSS weblogic 等等。   所以不管你在什么环境下写的Servlet程序,它的规范都是阿帕奇定义好的,到了其他web容器都能运行  。  就像生产usb 设备的厂商, 厂商是不同的,但是你只要按照usb2.o的标准来生产, 那么你生产出来的产品就能在支持usb2.0的设备上使用。  可能你生产的具体方法不一样,但是只要符合接口定义的规范就行了 Collection 是一个规范  ,他下面的 set 也好  list 也好  vector 也好, 遵循了Collection的规范,所以说可以充当Collection 来使用。比如电脑的pci接口   不管你是声卡,还是网卡,还是显卡。 只要遵循我的标准,都能当pci设备使用。
      

  8.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?Collection books = new HashSet();
    使用这种写法体现的是java的多态性,楼主可以查查。
    嗯,我知道这是多态,呃。
    还有一个问题就是为什么 对象c不能使用ArrayList里的方法?这个c难道不是ArrayList的实例吗
    哪有对象c? ArrayList的实例可以实现ArrayList的方法的不好意思,说错了,我说的是Collection books = new HashSet();这句话,books不能使用HashSet类中的方法,这是怎么回事
      

  9.   


    Collection books = new HashSet();
    HashSet实现了Collection接口,该代码创建了一个实现了Collection接口的
    子类对象并将其引用赋值给booksHashSet是Collection接口的具体实现
    父类引用是可以指向子类对象的!
    楼主多看看基础!
    我知道HashSet实现了Collection接口,那么直接HashSet books = new HashSet();不就创建一个实现Collection接口的对象了吗?Collection books = new HashSet();
    使用这种写法体现的是java的多态性,楼主可以查查。
    嗯,我知道这是多态,呃。
    还有一个问题就是为什么 对象c不能使用ArrayList里的方法?这个c难道不是ArrayList的实例吗
    哪有对象c? ArrayList的实例可以实现ArrayList的方法的不好意思,说错了,我说的是Collection books = new HashSet();这句话,books不能使用HashSet类中的方法,这是怎么回事因为books对象是Collection接口声明的。所以books对象只能用Collection里面声明的方法。-----------------------------------------------------------------------------------------------------------------
    这样做的好处:
    假设A和B是接口。A里面声明一个fun1方法,B里面声明一个fun2方法。
    而AB类的设计实现了A接口和B接口。
    那么A ab = new AB(); ab只能用A接口的fun1方法。
    那么B ab= new AB(); ab只能用B接口的fun2方法。
    这样更有助于大型的程序修改。只需改接口设计而不需要重新去改程序了。
    ----------------------------------------------------------------------------------------------------------------
    你只要知道:对象只能实现声明它的对象类型里面的方法。
    books只能实现Collection中实现的方法
      

  10.   

    基础问题 同楼上 楼主再复习下java基础知识吧
      

  11.   

    你好,没猜错的话楼主也应该初学Java的,我也是学习Java不久,曾经有过这样的困惑,所以能理解楼主。在JDK中,Collection是一个接口,HashSet实现了这个接口,而Collection books只是定义了一个Collection接口的引用,它可以指向任意可实例化的子类对象,这涉及到了面向接口编程,也许楼主现在还不明白,不过没有关系,在你后面使用Java的过程中你就会彻底明白这个问题的。开始学习Java的时候,我推荐看一些好的视频,比如黑马程序员里面毕向东的JavaSE视频,动手敲一些程序,在实践的过程中领会其中的道理,后面你会发现java这门面向对象的语言魅力无穷,希望你能爱上Java,做自己喜欢的事情,加油~ ~