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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 8161776 中级黑马   /  2012-5-19 18:50  /  2541 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Collection coll = new ArrayList(); 然后调用coll.toString()方法的时候用的是AbstractCollection类里面的toString()方法吧,现在问题就出来了,Collection coll = new ArrayList();这个不是向上转型了吗?现在的coll只能用Collection里的方法吧?而AbstractCollection虽然是ArrayList的父类,但是AbstractCollection还是Collection的子实现抽象类啊。Collection大呀,这个coll能用AbstractCollection里的toString方法?应该只能用Collection的或者Collection父类的吧。好纠结,难道是我理解有问题?求高手指点!!!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 李哲 于 2012-5-19 19:34 编辑

你很仔细。
虽然我学习多态,很注意。但是到后面学集合,确实就不太注意这个。
我刚才实验,不管是面向接口还是父类。如果使用多态形式,子类确实不能使用接口或者父类之外的方法,要使用,必须类型转换。或者不使用多态。
佩服。
  1. import java.util.ArrayList;
  2. import java.util.Collection;

  3. public class FuZi {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 Fu fz=new Zi();
  10.                 ((Zi) fz).go();
  11.                
  12.                 Hello hz=new Zi();
  13.                 ((Zi) hz).go();
  14.                
  15.                
  16.                 Collection al=new ArrayList();
  17.                 al.add("abc");
  18.                 System.out.println(((ArrayList) al).get(0));
  19.                
  20.                

  21.         }

  22. }
  23. class Fu{
  24.         void show(){
  25.                 System.out.println("abc");
  26.                
  27.         }
  28.         void run(){
  29.                 System.out.println("dfg");
  30.                
  31.         }
  32. }
  33. interface Hello{
  34.         String name="zhangsan";
  35.         void eat();
  36. }
  37. class Zi extends Fu implements Hello{
  38.         void go(){
  39.                 System.out.println("go");               
  40.         }

  41.         @Override
  42.         public void eat() {
  43.                 // TODO Auto-generated method stub
  44.                
  45.         }
  46. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 踩单车的幸福 于 2012-5-19 20:41 编辑

{:soso_e109:}强势围观
回复 使用道具 举报
ArrayList 是 的父类是 AbstractCollection的子类,AbstractCollection是Collection子类
举个例子. ArrayList是孙子 AbstractCollection是儿子Collection 是爷爷.

现在的coll只能用Collection里的方法吧? //你问的这个问题 coll 是孙子 他可以调用儿子AbstractCollection 和Collection爷爷的方法
Collection大呀,这个coll能用AbstractCollection里的toString方法?  //  coll是AbstractCollection的子类.是可以用的
应该只能用Collection的或者Collection父类的吧 //coll 也可以用Collection 的方法. 因为是他的父类的父类

你说的这几个类我没有详细了解,但是听你说的关系是Collection>AbstractCollection>ArrayList
最小的ArrayList也可以用最大的Collection的. 因为Collection也是他的父类

Collection coll = new ArrayList(); 从定义一个Collection类型的变量来接收他就能看出来
回复 使用道具 举报
踩单车的幸福 发表于 2012-5-19 19:58
我是这么觉得的,在api中指出,AbstractCollection被collection实现,换句话说collection因此也就多了一部 ...

哥们,AbstractCollection实现了collection接口,不是AbstractCollection被collection实现:L
回复 使用道具 举报
本帖最后由 杨尧 于 2012-5-19 20:50 编辑

其实我原本的意思是,Collection是个接口吧,他没有父类,也没实现什么接口,而且他的方法里面也没有toString()方法,
ArrayList是AbstractCollection的子类,AbstractCollection里面有toString方法,所以ArrayList对象是可以调用toString方法的,但是Collection coll = new ArrayList();这样一来,这个对象已经向上转型了,他只能调用这个Collection 所拥有的方法了,子类特有的方法他是不能调用的,当然父类有,子类也有的方法,实际上调用的是子类的方法,这是多态嘛,关键现在父类没有toString方法,为什么这个coll还可以调用toString()方法呢?
回复 使用道具 举报
针对你这个问题我想再提几个问题。。。
ArrayList 仅仅是Collection的实现类,就能Collection xx=new ArrayList;这是不是就是接口的基本含义啊?
实现是不是也同时继承里面的方法和字段呀,好像实现也要覆写其中所有的抽象方法,那么实现和继承的区别在哪里?
Collection xx=new ArrayList这种定义方法,之前有个老师说有***的好处,不懂 这样定义能有什么好处,求指点?

已知实现子类.png (4.69 KB, 下载次数: 24)

已知实现子类.png
回复 使用道具 举报
本帖最后由 杨尧 于 2012-5-19 22:07 编辑

ArrayList 仅仅是Collection的实现类,就能Collection xx=new ArrayList;这是不是就是接口的基本含义啊?
这样写跟接口没有直接关系,这是多态的表现形式,父类(接口)的引用指向子类的对象
实现是不是也同时继承里面的方法和字段呀,好像实现也要覆写其中所有的抽象方法,那么实现和继承的区别在哪里?
首先java继承只支持单继承,接口可以多实现,实现接口,就必须覆盖实现接口的方法。而继承就不一定(除非是抽象方法)。
Collection xx=new ArrayList这种定义方法,之前有个老师说有***的好处,不懂 这样定义能有什么好处,求指点?
这样面向接口的编程好处多的去了
1.更加抽象,更加面向对象
2.提高编程的灵活性
3.提高可维护性


有些地方说的不太详细,望大神补充
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马