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