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

Ann*_*igi 4 java collections

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

import java.util.*;

public class SetExample{

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

}
Run Code Online (Sandbox Code Playgroud)

在"Collection"API中是否有一个类'Set',我们正在创建一个对象('set')?或者我们正在实例化一个界面'Set'?

我真的很困惑.......:O

Ste*_*n C 12

java.util.Set是一个接口,而不是一个类.所以

Set set = new HashSet();
Run Code Online (Sandbox Code Playgroud)

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

Set set = new Set();
Run Code Online (Sandbox Code Playgroud)

由于无法创建接口实例,因此会出现编译错误.

Java接口本质上是实现(类)和使用它的东西之间的契约.它说明了符合对象的方法的名称和签名是什么,但没有关于对象的状态或其方法如何工作.

(只是为了混淆一点...... Java也允许你写这样的东西:

Set set = new Set() {
    // attributes and methods go here
};
Run Code Online (Sandbox Code Playgroud)

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