新足迹

 找回密码
 注册

精华好帖回顾

· 印记*如果在墨尔本遇见你。。。 (2010-11-6) 碧邪 · 日落拍到了........ (2010-6-23) jmms_smmj
· 老宝马换保姆车,买车记(更新上图在一楼) (2011-12-10) 七月 · 老公的早餐(改进滴煎饼果子+小米粥) (2008-10-21) 净心
Advertisement
Advertisement
查看: 1407|回复: 8

关于接口和向上转型 java [复制链接]

发表于 2011-4-4 17:10 |显示全部楼层
此文章由 wishmaster03 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishmaster03 所有!转贴必须注明作者、出处和本声明,并保持内容完整
新手~ 想问一下关于java中的接口和向上转型

例如 List list = new ArrayList();
和 ArrayList arrayList = new ArrayList();

这两句话第一句是创建ArrayList对象并耦合到List接口使实例"list"成为对接口List通用的对象, 因此list只含有List和ArrayList中的通用方法而不再具有ArrayList中区别List的方法
第二句是建立ArrayList对象, 包含所有ArrayList方法

那么我想问的问题是, 用第一句时既然ArrayList()已经向上转型成为List了, 那ArrayList()本身的方法存在的意义是什么?
还是说如果牵扯到比较复杂的接口编程, 需要创建ArrayList对象, 例如l, l可以对和list非通用的属性进行编辑, 而后建立一个引用 List lList = l; 来对通用接口进行编辑呢?

另外我注意到, 让一个方法要求一个接口对象时, 即使我创建的对象没用声明为接口类型, 而只是implements了接口, 那么参数传递进去时会自动upcasting到所需的接口.
例如 interface inter
{
....
}

class cl implements inter
{
...
}

public static void abc(inter i)
{
...
}

public static void main
{
cl c = new cl();
abc(c);
}

这里abc(c)仍旧是有效的.

所以我感到疑惑. 不知道最初说的那两句的区别和用途到底是什么样子的

希望大大们耐心帮我讲解下
Advertisement
Advertisement

发表于 2011-4-4 19:00 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这是oo的概念问题,一两句恐怕说不清楚。

你google一下polymorphism和 how to extend class.

不过搞懂了对长远也没啥好处,卡耐基梅隆不是号称只教functional,不玩OO了么?

评分

参与人数 1积分 +4 收起 理由
kane2001 + 4 偶对你的景仰如滔滔江水

查看全部评分

发表于 2011-4-4 21:06 |显示全部楼层
此文章由 wishmaster03 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishmaster03 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2011-4-4 19:00 发表
这是oo的概念问题,一两句恐怕说不清楚。

你google一下polymorphism和 how to extend class.

不过搞懂了对长远也没啥好处,卡耐基梅隆不是号称只教functional,不玩OO了么?


也明白这是一个模型 一般要碰到具体的情况才能切身的体会 网上查了一些例子 还是不能特别透彻的体会~

现在硕士快毕业了 感觉技术了解了一些 但基础还是不好 所以在恶补概念呢 看看能不能找到个工作~

发表于 2011-4-4 21:08 |显示全部楼层
此文章由 wishmaster03 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishmaster03 所有!转贴必须注明作者、出处和本声明,并保持内容完整
太前沿的东西离我们毕业生就业还比较远 觉得还是应该把最基础的东西弄牢固

发表于 2011-4-6 22:37 |显示全部楼层
此文章由 ysihaoy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 ysihaoy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果引用是接口List类型的话,你的确不能使用ArrayList里的特定方法了。不是说接口没用,接口的作用是实现解耦。
关于abc那个,它接受的参数类型是接口类型,也就是说任何实现了该接口的类的对象都可以作为它的参数传递。
没有任何矛盾。
这才体现出来接口的好处,如果没有接口几乎设计模式就无法实现了。
找一本书好好看看这些基本的知识,否则出来做项目让别人看到了太不好了。

发表于 2011-4-7 09:49 |显示全部楼层
此文章由 jasonwhy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jasonwhy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
举个最简单的例子,如果在一个类中,有一百个方法使用了ArrayList的实例。有一天出于性能或其他方面的考虑,你想把ArrayList变成LinkedList了或其他实现了List接口的类,如果是使用接口,这些方法都不需要作任何修改,你只需要把List list = new ArrayList()直接替换成List list = new LinkedList()即可。但是如果没使用接口,那你至少得修改超过一百个地方。当然,如果你是使用了ArrayList上特定的方法,那么该方法是不能被简单的被替换的。这就是编程的时候为什么要尽量的使用接口上通用的方法,这样程序有更好的可扩展性和灵活性,使代码的修改量减到最低,提供程序的可维护性。
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2011-4-7 10:20 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
现在一写就是List l = new ArrayList()了. 然后add, 或者for(XX : l){ }
头像被屏蔽

禁止访问

发表于 2011-4-7 11:02 |显示全部楼层

现在一写就是var l = new ArrayList()了. 然后add,

此文章由 atransformer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atransformer 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2011-4-8 13:25 |显示全部楼层
此文章由 wishmaster03 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wishmaster03 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jasonwhy 于 2011-4-7 09:49 发表
举个最简单的例子,如果在一个类中,有一百个方法使用了ArrayList的实例。有一天出于性能或其他方面的考虑,你想把ArrayList变成LinkedList了或其他实现了List接口的类,如果是使用接口,这些方法都不需要作任何修改,你只需要把 ...


有点明白你的意思, List接口使程序的通用性更强.

如果只是方法声明接收List类型 就已经能满足通用性了

即使最初把变量设置为ArrayList类型, 在通过方法的向上转型过程中, 实际上也被通用成为了List类型

应该是这样吧

比如这个例子
public class NewMain {
    ArrayList a = new ArrayList();

  
     public static void main(String[] args) {
     
     NewMain n = new NewMain();
     List b = n.getList();

    }

    public List getList()
    {
        return a;
    }

}

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部