此关键字不代表对象

时间:2019-08-21 05:24:27

标签: java

有人知道为什么我们可以在此处(在subsetOf方法中)遍历“ this”关键字吗?据我所知,这表示一个JAVA对象。欢迎进行一些广泛的解释,想知道为什么“ this”可以这样工作。

public class ArrayListSet<E> implements Set<E> {

    private ArrayList<E> elements;

    public ArrayListSet() {
        elements = new ArrayList<>();
    }

    @Override
    public void add(E e) {
        if (!elements.contains(e))
            elements.add(e);
    }

    @Override
    public void remove(E e) {
        elements.remove(e);
    }

    @Override
    public boolean contains(Object e) {
        return elements.contains(e);
    }

    @Override
    public int size() {
        return elements.size();
    }

    @Override
    public boolean subsetOf(Set<?> other) {
        for (E e : this) {
            if (!other.contains(e))
                return false;
        }
        return true;
    }
}

2 个答案:

答案 0 :(得分:8)

您要声明一个实现Set 接口的类,该类本身通过Iterable接口扩展Collection。任何实现Iterable接口的对象都可以在for-each循环内使用。

因此,您的类的继承层次结构是这样的:

 Iterable
    ^
    |
Collection
    ^
    |
   Set
    ^
    |
ArrayListSet

此外,this关键字始终引用当前实例。在您的代码中,当您执行subsetOf()时,this会指向ArrayListSet的实例(用于调用subSetOf()方法),它是{{ 1}}继承,因此您可以在for-each循环中使用它。

此外,由于要实现Iterable,因此需要提供在Set接口中定义的Iterator<E> iterator();方法的实现,以使其成为Set

由于Iterable接口的实现需要一个Iterable方法,该方法返回iterator()对象的实例。 Iterator对象将被for-each循环使用,以迭代Iterator的元素。

ArrayListSet方法返回的Iterator类型的实现实际上定义了for-each循环使用的迭代逻辑。

要在for-each循环中使用任何对象:

步骤1:直接扩展iterator()或通过其他Iterable类型扩展。

第2步:提供从Iterable接口继承的Iterator iterator()方法的实现。

第3步:实现Iterable并从Iterator方法返回其实例。

答案 1 :(得分:1)

由于它代表一个集合,因此您可以对其进行迭代。 setiterable。因此,这是有效的语法。