java抽象类方法

1yjd4xko  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(295)

我在声明抽象类的练习中遇到了以下代码:

import java.util.ArrayList;

public abstract class Box {

    public abstract void add(Item item);

    public void add(ArrayList<Item> items) {
        for (Item item : items) {
            Box.this.add(item);
        }
    }

    public abstract boolean isInBox(Item item);
}

我无法理解 add(ArrayList<Item> item) 方法确实如此。我知道它通过一个 ArrayList 被称为项目,但什么是 Box.this.add(item) 你知道吗?有人能澄清一下吗?

o0lyfsai

o0lyfsai1#

除了@ernest\u k在注解中所写的内容之外,还有一个实际的用例,您实际上需要用类名限定方法调用:如果您在访问外部类字段的方法中创建一个匿名内部类,就像下面的任意(在现实中非常无用)示例:

import java.util.ArrayList;

public abstract class Box {

    public abstract void add(String item);

    public void add(ArrayList<String> items) {
        for (String item : items) {
            Runnable r = new Runnable() {

                @Override
                public void run() {
                    add(item); // works, implicitly accesses Box.this.add
                    this.add(item); // does not work as "add" is not a method of the anonymous runnable
                    Box.this.add(item); // works
                }
            };
            r.run();
        }
    }

    public abstract boolean isInBox(String item);
}
23c0lvtd

23c0lvtd2#

该类正在声明一个接口,该接口中已有一些代码。具体地说,它声明了一个没有详细实现的box,您可以稍后使用适合您需要的底层代码创建box。
例如,可以声明boxonset类,该类使用hashset实现该声明:

public abstract class BoxOnSet extends Box {
    public BoxOnSet()
    {
        this.items = new HashSet<>();
    }

    public void add(Item item)
    {
        this.items.add( item );
    }

    public boolean isInBox(Item item)
    {
        return this.items.contains( item );
    }

    private HashSet<Item> items;
}

至于你的具体问题 add(ArrayList<>) 方法等效于collections addall()方法。它只是用抽象的 add(Item) 以便在盒子里插入物品。您可以指定 add( item ) , this.add( item ) 甚至 Box.this.add( item ) ,在本例中,它们都指向同一个方法,它们只是进一步指定的方法。

相关问题