在Java中,'Set'和'List'是从'Collection'接口派生的接口。 如果我们使用代码:
import java.util.*;
public class SetExample{
public stactic void main(String[] args){
Set set = new HashSet();
//do something .....
}
}
“Collection”API中是否有一个类'Set',我们正在创建一个对象('set')?或者我们正在实例化一个界面'Set'?
我真的很困惑.......:O
答案 0 :(得分:11)
java.util.Set
是一个接口,而不是一个类。所以
Set set = new HashSet();
创建一个HashSet
实例的对象,并将该对象的引用分配给类型为Set
的变量。这是有效的,因为HashSet
类实现了 Set
接口。另一方面:
Set set = new Set();
给出编译错误,因为您无法创建接口的实例。
Java接口本质上是实现(类)和使用它的东西之间的契约。它说明了符合对象的方法的名称和签名是什么,但没有关于对象的状态或其方法如何工作。
(只是为了让事情有点混乱...... Java也允许你写这样的东西:
Set set = new Set() {
// attributes and methods go here
};
这不会创建Set
接口本身的“实例” ...因为这没有意义。相反,它声明并实例化实现 Set
接口的匿名类。)
答案 1 :(得分:4)
以下是一些提示:
您还应该阅读Effective Java by Joshua Bloch,尤其是第52项:“通过界面引用对象”(可以看到一小段代码here)
答案 2 :(得分:1)
java.util.Set
接口提供与java.util.HashSet
对象的松散耦合。因此,开发人员可以将java.util.Set
引用用于另一个java.util.Set
接口系列对象。
答案 3 :(得分:0)
引用set
的类型为java.util.Set
,interface
。虽然它实际上指向java.util.HashSet
类型的对象。 (多晶型)
答案 4 :(得分:0)
在API中,您会获得一系列隐藏实现的接口。例如套装允许你
隐藏任何实现,HashSet就是其中之一。