黑马程序员技术交流社区
标题:
关于面向父类编程的一点疑惑
[打印本页]
作者:
kira
时间:
2014-3-11 16:58
标题:
关于面向父类编程的一点疑惑
本帖最后由 kira 于 2014-3-11 17:02 编辑
张孝祥老师曾近说过 同样的写法 你写成面向父类 人家就觉得你很专业
比如 List<String> li = new ArrayList<String>();
但是 今天恰逢回归集合的盲点LinkedList的时候 发现有点不一样 比如说
我new 一个LinkedList 然后添加几个元素 最后用1.6的新方法 offerFrist结果确报了错
但是如果老老实实的写LinkedList <String> li = new
LinkedList
<String>();
发现这方法又能用了 那这样岂不是说我们new出来的对象只是个list而不是他的子类么 这与代码也互相矛盾 这是为什么:(
下面是上述思想所写的简单的测试代码
import java.util.LinkedList;
import java.util.List;
public class LinkDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> link =new LinkedList<String>();
link.add("aaa");
link.add("bbb");
link.add("ccc");
link.offerFirst("sss");//这里就提示报错
}
}
复制代码
作者:
房建斌
时间:
2014-3-11 17:03
首先offerFirst是LinkedList特有的方法,在LinkedList的顶层接口List中是没有这个方法的。
offerFirst会出错是因为你用List的引用指向了LinkedList的实例对象,父类引用指向子类对象会缺失子类特有的一些内容的。
如果你要用的是LinkedList特有的方法,就不要用这话方法了。
作者:
kira
时间:
2014-3-11 17:30
房建斌 发表于 2014-3-11 17:03
首先offerFirst是LinkedList特有的方法,在LinkedList的顶层接口List中是没有这个方法的。
offerFirst会出 ...
但是这样一来就不符合多态的思想了啊 你比如说 我想要一个动物 你给我一个鸡
这没有问题 那么我拿到了鸡的引用就可以调用鸡的方法对吧 但是
现在这个例子就完全否认了这一观点 就变成了 我想得到鸡的特有方法 就只能找到鸡 而不是找到鸡的引用
:(
作者:
pifuhanshu
时间:
2014-3-11 18:01
List是继续自collect接口的有序集合,List可以根据元素索引进行取得、删除、插入操作。 LinkedList实现了List接口,LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。 “List<String> link =new LinkedList<String>();"把创建LinkList的对象赋给接口变量List型的接口变量link。 ”link.add("ccc");“语句是接口回调添加对象”ccc“。然而语句”link.offerFirst("sss");“接口回调link.offerFirst(),但link.offerFirst();只是LinstLink类的特有方法,而在List型对象没有link.offerFirst();方法。故接口回调会报错!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2