在定义'Set set = new HashSet()'时,是设置接口的实例还是类Set?

时间:2010-09-15 06:34:19

标签: java collections

在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

5 个答案:

答案 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.Setinterface。虽然它实际上指向java.util.HashSet类型的对象。 (多晶型)

答案 4 :(得分:0)

在API中,您会获得一系列隐藏实现的接口。例如套装允许你 隐藏任何实现,HashSet就是其中之一。