有时候会看见程序中的返回类型是接口类型,这是什么意思?
例如:
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()等本来就是空的方法,不含方法体的,而在你实现了该接口之后,编译器会自动的写出接口中该方法的方法体以实现功能的呢?
----------------解决方案--------------------------------------------------------
你只要明白继承的概念,就不会有这些疑问了.
你可以用一个类去继承一个抽象类(对接口来说,可以去实现一个接口),而这个类本身是可以实例化的(也就是说这个类本身不是个接口或抽象类),所以我门就可以生成这样的类的实例.而这个类既然继承父类(接口),那么它也是父类.(子类是父类).so...
比如说java.util.LinkedList,这个类是可以实例化的(可以new LinkedList),而LinkedList实现了Collection接口,所以你可以在需要返回Collection接口的地方返回一个LinkedList实例....
----------------解决方案--------------------------------------------------------
说清楚啊,还是不太明白
----------------解决方案--------------------------------------------------------
多谢BZ的回答,是不是这样?一个类实现了一个接口,所以该类实现了该接口中的方法,所以说子类是父类,在需要使用该接口中方法的时候,只要实例化一个实现了该接口的类的对象,因为此对象包含了该接口的所有方法,所以可以间接使用接口中的方法。
还有一点,书上的定义:接口中的方法只能是抽象方法,接口中的方法只给出方法名,返回值和参数表,不含具体实现功能的方法体。那么,Collection是一个接口,为什么它其中包含了很多有具体功能的方法呢?JDK文档中的资料。是不是这些方法是在某个类实现了该接口后,在该方法没被重载的情况下,由编译器自动在该类中隐藏生成了这些方法的方法体的呢?
----------------解决方案--------------------------------------------------------
还有一点,书上的定义:接口中的方法只能是抽象方法,接口中的方法只给出方法名,返回值和参数表,不含具体实现功能的方法体。那么,Collection是一个接口,为什么它其中包含了很多有具体功能的方法呢?JDK文档中的资料。是不是这些方法是在某个类实现了该接口后,在该方法没被重载的情况下,由编译器自动在该类中隐藏生成了这些方法的方法体的呢?
楼主对接口的理解还是很有问题.
接口就是只声明一些方法的特殊的类.
所有实现该接口的非抽象类(就是能够实例化的类)必须覆些这些方法!
我标红色的地方是楼主理解有误的地方.
另外,重载是指相同的方法名,不同的参数的方法叫方法的重载.
覆些是指父类已经存在的相同名字,相同参数,而子类重新实现的方法.
[此贴子已经被作者于2007-3-17 13:26:27编辑过]
----------------解决方案--------------------------------------------------------
恩,我的描述有些问题,就是说在JDK文档中,某个接口下面的Method Summary(方法描述)中的方法,实际是在实现该接口的类中进行覆写的,例如Collection接口中的iterator()方法,ArrayList是一个实现了Collection接口的类,在JDK文档中ArrayList的方法描述中并没有iterator()方法,但是实际它已经对Collection接口的iterator()方法进行了覆写,实现了Collection接口的方法描述中的iterator()方法的功能,实际在定义Collection接口的时候,iterator()只是一个空的方法。是这样么?
所以,必须要有实现了接口的类的对象,才可以调用接口中的方法。
----------------解决方案--------------------------------------------------------
恩,我的描述有些问题,就是说在JDK文档中,某个接口下面的Method Summary(方法描述)中的方法,实际是在实现该接口的类中进行覆写的,例如Collection接口中的iterator()方法,ArrayList是一个实现了Collection接口的类,在JDK文档中ArrayList的方法描述中并没有iterator()方法,但是实际它已经对Collection接口的iterator()方法进行了覆写,实现了Collection接口的方法描述中的iterator()方法的功能,实际在定义Collection接口的时候,iterator()只是一个空的方法。是这样么?
所以,必须要有实现了接口的类的对象,才可以调用接口中的方法。
接口就是定义一组方法让声明实现它的类去实现
这也是多态的经典设计,只有这样才可以让语言变得很灵活
在定义一个接口的时候,里面所有的方法都是抽象方法,这和空方法有本质的区别
空方法是有实现的,只不过实现是空的而已,而抽象方法是完全没有实现的,如果你是它的子类,你又不是实现又不声明为抽 象类的话,那是会报错的,而空方法却不会报错,还有,接口里面定义的方法只能是抽象方法,不能是空方法
----------------解决方案--------------------------------------------------------