java - 定义 'Set set = new HashSet()' 时,设置为接口(interface)或类 Set 的实例?

标签 java collections

在 Java 中,'Set' 和 'List' 是从 'Collection' 接口(interface)派生的接口(interface)。 如果我们使用代码:

import java.util.*;

public class SetExample{

    public stactic void main(String[] args){
      Set set = new HashSet();
      //do something .....
    }

}

“Collection”API 中是否有一个类“Set”,我们正在为其创建一个对象(“set”)?或者我们正在实例化接口(interface)“Set”?

我真的很迷茫......:O

最佳答案

java.util.Set 是一个接口(interface),而不是一个类。所以

Set set = new HashSet();

创建一个 HashSet 实例的对象,并将对该对象的引用分配给类型为 Set 的变量。这是有效的,因为 HashSet实现 Set 接口(interface)。另一方面:

Set set = new Set();

给出一个编译错误,因为你不能创建一个接口(interface)的实例。

Java 接口(interface)本质上是实现(类)和使用它的事物之间的契约。它说明了一致对象方法的名称和签名是什么,但没有说明对象的状态或其方法如何工作。

(只是为了让事情有点困惑......Java 也允许你写这样的东西:

Set set = new Set() {
    // attributes and methods go here
};

这不会创建 Set 接口(interface)的“实例”本身 ... 因为那没有意义。相反,它声明并实例化一个匿名类,该类实现 Set 接口(interface)。)

关于java - 定义 'Set set = new HashSet()' 时,设置为接口(interface)或类 Set 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715209/

相关文章:

Java 集合 API : why are Unmodifiable[List|Set|Map] not publicly visible classes?

c# - 使用哈希表仅存储键?

java - ImmutableList 不扩展 List?

java - 在 java jdb 调试器中打印变量

java - 在 Eclipse E4 中突出显示 Activity MPart 选项卡

java - 每个 HBase 表一个 Reducer

collections - 为什么整数必须先转换为字符串才能用于访问集合中的项目?

java - 收集器收集java中的pair列表

java - TextView 扩展;不支持的操作异常

c# - 有人可以告诉我 List、Collection 和 Enumerable 之间有什么区别?