Collection c = new ArrayList()
importjava.util.*;publicclasstest{publicstaticvoidmain(String[]args){Collectionc=newA...
import java.util.*;
public class test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("hello");
........
........
}
}
ArrayList类继承AbstractList类,AbstractList类实现Collection接口,
ArrayList类重写了AbstractList类的add()方法,
请问一下这个程序,c.add("hello"); 调用的到底是ArrayList类的方法,还是其父类的方法?
这里算是多态么?
如果调用的是子类的(它本身)的方法,
那把 new ArrayList() 变成 new LinkedList();为啥下面的方法就不用改变了、
这个弯我一直没有转过来,请大神指教、、、、拜托了、、、 展开
public class test {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("hello");
........
........
}
}
ArrayList类继承AbstractList类,AbstractList类实现Collection接口,
ArrayList类重写了AbstractList类的add()方法,
请问一下这个程序,c.add("hello"); 调用的到底是ArrayList类的方法,还是其父类的方法?
这里算是多态么?
如果调用的是子类的(它本身)的方法,
那把 new ArrayList() 变成 new LinkedList();为啥下面的方法就不用改变了、
这个弯我一直没有转过来,请大神指教、、、、拜托了、、、 展开
2个回答
展开全部
你好。关键你要明白这点。
如果子类中重写了add方法,那么就调用的是子类的中的【你可以看源码或者API都有说明】,这就是多态。
多说无益,怕更误导你,还是看你有什么疑问我在给你解答。
如果子类中重写了add方法,那么就调用的是子类的中的【你可以看源码或者API都有说明】,这就是多态。
多说无益,怕更误导你,还是看你有什么疑问我在给你解答。
追问
这样写的好处到底是什么? 这里是多态吧,
那在实际中调用那重写方法的时候,是调用的子类的方法,改成LinkedList()的时候,调用的方法也跟着改变了,虽然下面的程序代码不用变?是这样吗?
我想问,不管两种方法内部的实现一样或者不一样,因为他们都实现了Collection接口,那么
Collection定义的方法add()的作用是不是都是一样的、我们只需要知道这个方法是用来干什么的,而不是怎么做的?
拜托,每个问号给个答案
追答
第一个问题也就是多态的好处,可以归纳为如下5点:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。【在你的问题上有体现】
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。【体现】
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。 【在你的问题上有体现】
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
第二个问题:是的,add方法的具体实现是在子类中封装好的。对下面肯定没有影响。
第三个问题:对,这就是面向对象,接口就是一个更高层的抽象。这个add()方法什么都不做,就是表示一个添加元素的概念,到底怎么添加,添加什么类型的元素,全都交给了它的实现类。
展开全部
这位同学,这个就是多态神奇的地方,在java里这个叫晚绑定。
在编译时,其实没有进行具体的类型判断,而是在执行时,才进行的判断,也就是说,在执行到
c.add()这个方法的时候,才会进行具体的判断,这时候判断出来的是c是ArrayList类型,于是调用的是ArrayList类下的add方法,所以你把ArrayList改成LinkedList时也是一样的,执行到c.add这个方法的时候,才去判断具体类型,判断出是LinkedList的时候,就会调用LinkedList下的add方法。
在编译时,其实没有进行具体的类型判断,而是在执行时,才进行的判断,也就是说,在执行到
c.add()这个方法的时候,才会进行具体的判断,这时候判断出来的是c是ArrayList类型,于是调用的是ArrayList类下的add方法,所以你把ArrayList改成LinkedList时也是一样的,执行到c.add这个方法的时候,才去判断具体类型,判断出是LinkedList的时候,就会调用LinkedList下的add方法。
追问
嗯,谢谢了,
我还想问,collection c = new arraylist();这样写的好处是不是像我下面的想法?
当变成linkedlist的时候,实际中调用的方法虽然变了,但是他也实现了collection方法,collection定义了add方法的作用,就是往集合里面添加对象,只要你实现了我(collection),就必须满足我的规定,不管你怎么实现,你必须往里面添加一个对象、、所以当改成LinkedList的时候,代码不用变、这就是好处?是这样吗?
追答
是的,这的确就是多态的一大方便之处。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询