Java抽象类方法

Java抽象类方法,java,abstract-class,Java,Abstract Class,我在声明抽象类的练习中遇到了以下代码: 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); }

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

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);
}
import java.util.ArrayList;
公共抽象类框{
公开摘要作废增加(项);
公共作废添加(ArrayList项){
用于(项目:项目){
框。此。添加(项目);
}
}
公共抽象布尔isInBox(项);
}
我无法理解
add(ArrayList项)
方法的作用。我知道它在名为items的
ArrayList
中循环,但是
框做了什么。这个.add(item)
做了什么?
有人能澄清这一点吗?

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

import java.util.ArrayList;
公共抽象类框{
公共摘要作废添加(字符串项);
公共作废添加(ArrayList项){
用于(字符串项:项){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
添加(项);//工作,隐式访问Box.this.add
this.add(item);//不起作用,因为“add”不是匿名runnable的方法
Box.this.add(item);//有效
}
};
r、 run();
}
}
公共抽象布尔值isInBox(字符串项);
}

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

例如,您可以声明boxSet类,该类使用哈希集实现该声明:

公共抽象类boxBox{
公共卫生服务(
{
this.items=new HashSet();
}
公共作废添加(项目)
{
此.items.add(item);
}
公共布尔值isInBox(项)
{
返回此.items.contains(项目);
}
私有哈希集项;
}

至于您的具体问题,
add(ArrayList)
方法相当于collections addAll()方法。它只使用摘要
add(Item)
框中插入项。您可以指定
add(item)
this.add(item)
甚至
框。this.add(item)
,在本例中,它们都指向相同的方法,只是进一步指定的方法。

在这种情况下,这与
this.add(item)
或只是
add(item)
相同。开发人员只是决定对方法调用进行超出常规的限定。基本上是:糟糕的风格。注意:坏样式还在继续,因为如果将该方法
add(arraylistitems)
命名为
addAll(List items)
会更好。1) 为避免混淆add()和addAll()。。。2) 要使用接口列表而不是某些实现类型ArrayList。。。使Box类本身泛型。整个
Box
可以是一个接口。用户主要询问奇怪的Box。这种语法…Box的抽象类声明不包含任何ArrayList。我想知道该项将添加什么。@Ramkay,
ArrayList
是第二个
add()
方法的参数,该方法本应命名为
addAll()
或类似名称,以表明它显然具有扩展功能。。Box类是抽象的,因此将项添加到哪些派生类中由派生类决定。
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);
}

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;
}