| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1496 人关注过本帖
标题:[求助]问题求助!关于返回类型为接口
只看楼主 加入收藏
dragon555
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-3-16
收藏
 问题点数:0 回复次数:6 
[求助]问题求助!关于返回类型为接口

有时候会看见程序中的返回类型是接口类型,这是什么意思?
例如:
public Collection getItems(){
return items.values();
}

.......

for(Iterator i =getItems().iterator();i.hasNext();)
{.........}

以上代码中的items是HashMap类型。

如红色字体部分,为什么getItems()方法可以返回一个接口类型的值?接口不是不可以实例化对象么?如何作为一个值的类型?
还有一个一直想不通的问题,也是关于接口的,如上面蓝色部分,Collection是一个接口,按照接口的定义,接口中的方法只能给出方法名,返回值类型和参数表,不能包含实现功能的方法体,而Collection接口中包含很多实现了各种功能的方法,如上面的iterator() ,还有size() ,add(Object o) 等等,具体见JDK文档,这些方法都不仅仅是一个空的方法,包含着实在的功能,可以直接使用的,那么不是和接口的定义相违背了么? 是不是本来Collection中的这些方法如iterator()等本来就是空的方法,不含方法体的,而在你实现了该接口之后,编译器会自动的写出接口中该方法的方法体以实现功能的呢?

搜索更多相关主题的帖子: 接口 类型 FONT getItems Collection 
2007-03-16 20:52
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
你只要明白继承的概念,就不会有这些疑问了.
你可以用一个类去继承一个抽象类(对接口来说,可以去实现一个接口),而这个类本身是可以实例化的(也就是说这个类本身不是个接口或抽象类),所以我门就可以生成这样的类的实例.而这个类既然继承父类(接口),那么它也是父类.(子类是父类).so...
比如说java.util.LinkedList,这个类是可以实例化的(可以new LinkedList),而LinkedList实现了Collection接口,所以你可以在需要返回Collection接口的地方返回一个LinkedList实例....

My BlogClick Me
2007-03-16 21:38
sea7
Rank: 2
等 级:新手上路
威 望:3
帖 子:291
专家分:0
注 册:2007-2-17
收藏
得分:0 
说清楚啊,还是不太明白

软件是一种修养
2007-03-17 08:03
dragon555
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-3-16
收藏
得分:0 
多谢BZ的回答,是不是这样?一个类实现了一个接口,所以该类实现了该接口中的方法,所以说子类是父类,在需要使用该接口中方法的时候,只要实例化一个实现了该接口的类的对象,因为此对象包含了该接口的所有方法,所以可以间接使用接口中的方法。

还有一点,书上的定义:接口中的方法只能是抽象方法,接口中的方法只给出方法名,返回值和参数表,不含具体实现功能的方法体。那么,Collection是一个接口,为什么它其中包含了很多有具体功能的方法呢?JDK文档中的资料。是不是这些方法是在某个类实现了该接口后,在该方法没被重载的情况下,由编译器自动在该类中隐藏生成了这些方法的方法体的呢?

2007-03-17 11:09
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
收藏
得分:0 
以下是引用dragon555在2007-3-17 11:09:24的发言:

还有一点,书上的定义:接口中的方法只能是抽象方法,接口中的方法只给出方法名,返回值和参数表,不含具体实现功能的方法体。那么,Collection是一个接口,为什么它其中包含了很多有具体功能的方法呢?JDK文档中的资料。是不是这些方法是在某个类实现了该接口后,在该方法没被重载的情况下,由编译器自动在该类中隐藏生成了这些方法的方法体的呢

楼主对接口的理解还是很有问题.
接口就是只声明一些方法的特殊的类.
所有实现该接口的非抽象类(就是能够实例化的类)必须覆些这些方法!
我标红色的地方是楼主理解有误的地方.
另外,重载是指相同的方法名,不同的参数的方法叫方法的重载.
覆些是指父类已经存在的相同名字,相同参数,而子类重新实现的方法.

[此贴子已经被作者于2007-3-17 13:26:27编辑过]


My BlogClick Me
2007-03-17 13:26
dragon555
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-3-16
收藏
得分:0 

恩,我的描述有些问题,就是说在JDK文档中,某个接口下面的Method Summary(方法描述)中的方法,实际是在实现该接口的类中进行覆写的,例如Collection接口中的iterator()方法,ArrayList是一个实现了Collection接口的类,在JDK文档中ArrayList的方法描述中并没有iterator()方法,但是实际它已经对Collection接口的iterator()方法进行了覆写,实现了Collection接口的方法描述中的iterator()方法的功能,实际在定义Collection接口的时候,iterator()只是一个空的方法。是这样么?
所以,必须要有实现了接口的类的对象,才可以调用接口中的方法。

2007-03-17 14:13
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
以下是引用dragon555在2007-3-17 14:13:43的发言:

恩,我的描述有些问题,就是说在JDK文档中,某个接口下面的Method Summary(方法描述)中的方法,实际是在实现该接口的类中进行覆写的,例如Collection接口中的iterator()方法,ArrayList是一个实现了Collection接口的类,在JDK文档中ArrayList的方法描述中并没有iterator()方法,但是实际它已经对Collection接口的iterator()方法进行了覆写,实现了Collection接口的方法描述中的iterator()方法的功能,实际在定义Collection接口的时候,iterator()只是一个空的方法。是这样么?
所以,必须要有实现了接口的类的对象,才可以调用接口中的方法。

接口就是定义一组方法让声明实现它的类去实现

这也是多态的经典设计,只有这样才可以让语言变得很灵活

在定义一个接口的时候,里面所有的方法都是抽象方法,这和空方法有本质的区别

空方法是有实现的,只不过实现是空的而已,而抽象方法是完全没有实现的,如果你是它的子类,你又不是实现又不声明为抽 象类的话,那是会报错的,而空方法却不会报错,还有,接口里面定义的方法只能是抽象方法,不能是空方法


可惜不是你,陪我到最后
2007-03-18 10:15
快速回复:[求助]问题求助!关于返回类型为接口
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023686 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved